Translated all comments and documentation to english language.
--- a/Makefile Thu Apr 20 13:19:36 2006 +0000
+++ b/Makefile Thu Apr 20 13:31:31 2006 +0000
@@ -9,7 +9,7 @@
ifneq ($(KERNELRELEASE),)
#------------------------------------------------------------------------------
-# kbuild section
+# kbuild section
obj-m := master/ devices/
@@ -18,7 +18,7 @@
else
#------------------------------------------------------------------------------
-# default section
+# default section
ifneq ($(wildcard ethercat.conf),)
include ethercat.conf
--- a/devices/8139too.c Thu Apr 20 13:19:36 2006 +0000
+++ b/devices/8139too.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,14 +2,15 @@
*
* 8 1 3 9 t o o . c
*
- * EtherCAT-Treiber für RTL8139-kompatible Netzwerkkarten.
+ * EtherCAT driver for RTL8139-compatible NICs.
*
- * Autoren: Wilhelm Hagemeister, Florian Pose
+ * Authors: Florian Pose <fp@igh-essen.com>
+ * Wilhelm Hagemeister <hm@igh-essen.com>
*
* $Date$
* $Author$
*
- * (C) Copyright IgH 2005
+ * (C) Copyright IgH 2006
* Ingenieurgemeinschaft IgH
* Heinz-Bäcker Str. 34
* D-45356 Essen
@@ -112,7 +113,6 @@
#define DRV_NAME "8139too_ec"
#define DRV_VERSION "0.9.27"
-
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
@@ -644,8 +644,10 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-MODULE_AUTHOR ("Wilhelm Hagemeister <hm@igh-essen.com>, Florian Pose <fp@igh-essen.com>");
-MODULE_DESCRIPTION ("RealTek RTL-8139 Fast Ethernet driver with EtherCAT functionality");
+MODULE_AUTHOR("Wilhelm Hagemeister <hm@igh-essen.com>,"
+ " Florian Pose <fp@igh-essen.com>");
+MODULE_DESCRIPTION("RealTek RTL-8139 Fast Ethernet"
+ " driver with EtherCAT functionality");
MODULE_LICENSE("GPL");
MODULE_VERSION(COMPILE_INFO);
@@ -664,8 +666,10 @@
module_param(ec_device_index, int, -1);
module_param(ec_device_master_index, int, 0);
-MODULE_PARM_DESC(ec_device_index, "Index of the device reserved for EtherCAT.");
-MODULE_PARM_DESC(ec_device_master_index, "Index of the EtherCAT master to register the device.");
+MODULE_PARM_DESC(ec_device_index,
+ "Index of the device reserved for EtherCAT.");
+MODULE_PARM_DESC(ec_device_master_index,
+ "Index of the EtherCAT master to register the device.");
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1082,12 +1086,11 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- /* EtherCAT-Karten nicht beim Stack anmelden. */
- if (dev != rtl_ec_net_dev)
- {
- DPRINTK("About to register device named %s (%p)...\n", dev->name, dev);
- i = register_netdev (dev);
- if (i) goto err_out;
+ if (dev != rtl_ec_net_dev) {
+ DPRINTK("About to register device named %s (%p)...\n",
+ dev->name, dev);
+ i = register_netdev (dev);
+ if (i) goto err_out;
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1181,9 +1184,8 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- unregister_netdev (dev);
+ if (dev != rtl_ec_net_dev) {
+ unregister_netdev (dev);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1394,11 +1396,11 @@
printk(KERN_DEBUG "%s: open\n", dev->name);
#endif
- if (dev != rtl_ec_net_dev)
- {
- retval = request_irq(dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev);
- if (retval)
- return retval;
+ if (dev != rtl_ec_net_dev) {
+ retval = request_irq(dev->irq, rtl8139_interrupt,
+ SA_SHIRQ, dev->name, dev);
+ if (retval)
+ return retval;
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1411,9 +1413,8 @@
{
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- free_irq(dev->irq, dev);
+ if (dev != rtl_ec_net_dev) {
+ free_irq(dev->irq, dev);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1436,20 +1437,18 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- netif_start_queue (dev);
-
- if (netif_msg_ifup(tp))
- {
- printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d"
- " GP Pins %2.2x %s-duplex.\n",
- dev->name, pci_resource_start (tp->pci_dev, 1),
- dev->irq, RTL_R8 (MediaStatus),
- tp->mii.full_duplex ? "full" : "half");
- }
-
- rtl8139_start_thread(dev);
+ if (dev != rtl_ec_net_dev) {
+ netif_start_queue (dev);
+
+ if (netif_msg_ifup(tp)) {
+ printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d"
+ " GP Pins %2.2x %s-duplex.\n",
+ dev->name, pci_resource_start (tp->pci_dev, 1),
+ dev->irq, RTL_R8 (MediaStatus),
+ tp->mii.full_duplex ? "full" : "half");
+ }
+
+ rtl8139_start_thread(dev);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1536,10 +1535,9 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- /* Enable all known interrupts by setting the interrupt mask. */
- RTL_W16 (IntrMask, rtl8139_intr_mask);
+ if (dev != rtl_ec_net_dev) {
+ /* Enable all known interrupts by setting the interrupt mask. */
+ RTL_W16 (IntrMask, rtl8139_intr_mask);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1805,32 +1803,29 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- spin_lock(&tp->rx_lock);
-
- /* Disable interrupts by clearing the interrupt mask. */
- RTL_W16 (IntrMask, 0x0000);
-
- /* Stop a shared interrupt from scavenging while we are. */
- spin_lock_irqsave (&tp->lock, flags);
- rtl8139_tx_clear (tp);
- spin_unlock_irqrestore (&tp->lock, flags);
-
- /* ...and finally, reset everything */
-
- if (netif_running(dev))
- {
- rtl8139_hw_start (dev);
- netif_wake_queue (dev);
- }
-
- spin_unlock(&tp->rx_lock);
+ if (dev != rtl_ec_net_dev) {
+ spin_lock(&tp->rx_lock);
+
+ /* Disable interrupts by clearing the interrupt mask. */
+ RTL_W16 (IntrMask, 0x0000);
+
+ /* Stop a shared interrupt from scavenging while we are. */
+ spin_lock_irqsave (&tp->lock, flags);
+ rtl8139_tx_clear (tp);
+ spin_unlock_irqrestore (&tp->lock, flags);
+
+ /* ...and finally, reset everything */
+
+ if (netif_running(dev)) {
+ rtl8139_hw_start (dev);
+ netif_wake_queue (dev);
+ }
+
+ spin_unlock(&tp->rx_lock);
}
- else
- {
- rtl8139_tx_clear (tp);
- rtl8139_hw_start(dev);
+ else {
+ rtl8139_tx_clear (tp);
+ rtl8139_hw_start(dev);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1864,9 +1859,8 @@
return 0;
}
- if (dev != rtl_ec_net_dev)
- {
- spin_lock_irq(&tp->lock);
+ if (dev != rtl_ec_net_dev) {
+ spin_lock_irq(&tp->lock);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -1881,8 +1875,7 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
+ if (dev != rtl_ec_net_dev) {
if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
netif_stop_queue (dev);
@@ -1972,9 +1965,8 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- netif_wake_queue (dev);
+ if (dev != rtl_ec_net_dev) {
+ netif_wake_queue (dev);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2184,42 +2176,41 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- /* Malloc up new buffer, compatible with net-2e. */
- /* Omit the four octet CRC from the length. */
- skb = dev_alloc_skb(pkt_size + 2);
-
- if (likely(skb)) {
- skb->dev = dev;
- skb_reserve (skb, 2); /* 16 byte align the IP fields. */
+ if (dev != rtl_ec_net_dev) {
+ /* Malloc up new buffer, compatible with net-2e. */
+ /* Omit the four octet CRC from the length. */
+ skb = dev_alloc_skb(pkt_size + 2);
+
+ if (likely(skb)) {
+ skb->dev = dev;
+ skb_reserve (skb, 2); /* 16 byte align the IP fields. */
#if RX_BUF_IDX == 3
- wrap_copy(skb, rx_ring, ring_offset+4, pkt_size);
+ wrap_copy(skb, rx_ring, ring_offset+4, pkt_size);
#else
- eth_copy_and_sum (skb, &rx_ring[ring_offset + 4], pkt_size, 0);
+ eth_copy_and_sum (skb, &rx_ring[ring_offset + 4], pkt_size, 0);
#endif
- skb_put (skb, pkt_size);
-
- skb->protocol = eth_type_trans (skb, dev);
-
- dev->last_rx = jiffies;
- tp->stats.rx_bytes += pkt_size;
- tp->stats.rx_packets++;
-
- netif_receive_skb (skb);
- } else {
- if (net_ratelimit())
- printk (KERN_WARNING
- "%s: Memory squeeze, dropping packet.\n",
- dev->name);
- tp->stats.rx_dropped++;
- }
+ skb_put (skb, pkt_size);
+
+ skb->protocol = eth_type_trans (skb, dev);
+
+ dev->last_rx = jiffies;
+ tp->stats.rx_bytes += pkt_size;
+ tp->stats.rx_packets++;
+
+ netif_receive_skb (skb);
+ } else {
+ if (net_ratelimit())
+ printk (KERN_WARNING
+ "%s: Memory squeeze, dropping packet.\n",
+ dev->name);
+ tp->stats.rx_dropped++;
+ }
}
else
{
ecdev_receive(rtl_ec_dev,
- &rx_ring[ring_offset + 4] + ETH_HLEN,
- pkt_size - ETH_HLEN);
+ &rx_ring[ring_offset + 4] + ETH_HLEN,
+ pkt_size - ETH_HLEN);
dev->last_rx = jiffies;
tp->stats.rx_bytes += pkt_size;
tp->stats.rx_packets++;
@@ -2347,18 +2338,16 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev == rtl_ec_net_dev)
- {
- status = RTL_R16 (IntrStatus);
- }
- else
- {
- spin_lock(&tp->lock);
-
- status = RTL_R16 (IntrStatus);
-
- if (unlikely((status & rtl8139_intr_mask) == 0))
- goto out;
+ if (dev == rtl_ec_net_dev) {
+ status = RTL_R16 (IntrStatus);
+ }
+ else {
+ spin_lock(&tp->lock);
+
+ status = RTL_R16 (IntrStatus);
+
+ if (unlikely((status & rtl8139_intr_mask) == 0))
+ goto out;
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2371,13 +2360,12 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- /* close possible race's with dev_close */
- if (unlikely(!netif_running(dev))) {
- RTL_W16 (IntrMask, 0);
- goto out;
- }
+ if (dev != rtl_ec_net_dev) {
+ /* close possible race's with dev_close */
+ if (unlikely(!netif_running(dev))) {
+ RTL_W16 (IntrMask, 0);
+ goto out;
+ }
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2399,19 +2387,17 @@
if (status & RxAckBits)
{
- if (dev != rtl_ec_net_dev)
- {
- /* Polling vormerken */
- if (netif_rx_schedule_prep(dev)) {
- RTL_W16_F (IntrMask, rtl8139_norx_intr_mask);
- __netif_rx_schedule (dev);
+ if (dev != rtl_ec_net_dev) {
+ /* Mark for polling */
+ if (netif_rx_schedule_prep(dev)) {
+ RTL_W16_F (IntrMask, rtl8139_norx_intr_mask);
+ __netif_rx_schedule (dev);
+ }
}
- }
- else
- {
- /* Beim EtherCAT-Device einfach alle Frames empfangen */
- rtl8139_rx(dev, tp, 100); // FIXME
- }
+ else {
+ /* EtherCAT device: Just receive all frames */
+ rtl8139_rx(dev, tp, 100); // FIXME
+ }
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2429,9 +2415,8 @@
out:
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- spin_unlock (&tp->lock);
+ if (dev != rtl_ec_net_dev) {
+ spin_unlock (&tp->lock);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2463,52 +2448,50 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev != rtl_ec_net_dev)
- {
- netif_stop_queue(dev);
- if (tp->thr_pid >= 0) {
- tp->time_to_die = 1;
- wmb();
- ret = kill_proc (tp->thr_pid, SIGTERM, 1);
- if (ret) {
- printk (KERN_ERR "%s: unable to signal thread\n", dev->name);
- return ret;
- }
- wait_for_completion (&tp->thr_exited);
+ if (dev != rtl_ec_net_dev) {
+ netif_stop_queue(dev);
+ if (tp->thr_pid >= 0) {
+ tp->time_to_die = 1;
+ wmb();
+ ret = kill_proc (tp->thr_pid, SIGTERM, 1);
+ if (ret) {
+ printk (KERN_ERR "%s: unable to signal thread\n", dev->name);
+ return ret;
}
-
- if (netif_msg_ifdown(tp))
- printk(KERN_DEBUG "%s: Shutting down ethercard, status was 0x%4.4x.\n",
- dev->name, RTL_R16 (IntrStatus));
-
- spin_lock_irqsave (&tp->lock, flags);
-
- /* Stop the chip's Tx and Rx DMA processes. */
- RTL_W8 (ChipCmd, 0);
-
- /* Disable interrupts by clearing the interrupt mask. */
- RTL_W16 (IntrMask, 0);
-
- /* Update the error counts. */
- tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
- RTL_W32 (RxMissed, 0);
-
- spin_unlock_irqrestore (&tp->lock, flags);
-
- synchronize_irq (dev->irq); /* racy, but that's ok here */
- free_irq (dev->irq, dev);
+ wait_for_completion (&tp->thr_exited);
+ }
+
+ if (netif_msg_ifdown(tp))
+ printk(KERN_DEBUG "%s: Shutting down ethercard, status was 0x%4.4x.\n",
+ dev->name, RTL_R16 (IntrStatus));
+
+ spin_lock_irqsave (&tp->lock, flags);
+
+ /* Stop the chip's Tx and Rx DMA processes. */
+ RTL_W8 (ChipCmd, 0);
+
+ /* Disable interrupts by clearing the interrupt mask. */
+ RTL_W16 (IntrMask, 0);
+
+ /* Update the error counts. */
+ tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
+ RTL_W32 (RxMissed, 0);
+
+ spin_unlock_irqrestore (&tp->lock, flags);
+
+ synchronize_irq (dev->irq); /* racy, but that's ok here */
+ free_irq (dev->irq, dev);
}
- else
- {
- /* Stop the chip's Tx and Rx DMA processes. */
- RTL_W8 (ChipCmd, 0);
-
- /* Disable interrupts by clearing the interrupt mask. */
- RTL_W16 (IntrMask, 0);
-
- /* Update the error counts. */
- tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
- RTL_W32 (RxMissed, 0);
+ else {
+ /* Stop the chip's Tx and Rx DMA processes. */
+ RTL_W8 (ChipCmd, 0);
+
+ /* Disable interrupts by clearing the interrupt mask. */
+ RTL_W16 (IntrMask, 0);
+
+ /* Update the error counts. */
+ tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
+ RTL_W32 (RxMissed, 0);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2729,7 +2712,7 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
if (dev == rtl_ec_net_dev || !netif_running(dev))
- return -EINVAL;
+ return -EINVAL;
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2749,12 +2732,11 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
- if (dev == rtl_ec_net_dev || netif_running(dev))
- {
- spin_lock_irqsave (&tp->lock, flags);
- tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
- RTL_W32 (RxMissed, 0);
- spin_unlock_irqrestore (&tp->lock, flags);
+ if (dev == rtl_ec_net_dev || netif_running(dev)) {
+ spin_lock_irqsave (&tp->lock, flags);
+ tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
+ RTL_W32 (RxMissed, 0);
+ spin_unlock_irqrestore (&tp->lock, flags);
}
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2837,7 +2819,7 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
if (dev == rtl_ec_net_dev || !netif_running (dev))
- return 0;
+ return 0;
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2870,7 +2852,7 @@
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
if (dev == rtl_ec_net_dev || !netif_running (dev))
- return 0;
+ return 0;
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@@ -2942,23 +2924,23 @@
static void __exit rtl8139_cleanup_module (void)
{
- /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
-
- printk(KERN_INFO "Cleaning up RTL8139-EtherCAT module...\n");
-
- if (rtl_ec_net_dev) {
- printk(KERN_INFO "Stopping device...\n");
- ecdev_stop(ec_device_master_index);
- printk(KERN_INFO "Unregistering device...\n");
- ecdev_unregister(ec_device_master_index, rtl_ec_dev);
- rtl_ec_dev = NULL;
- }
-
- pci_unregister_driver(&rtl8139_pci_driver);
-
- printk(KERN_INFO "RTL8139-EtherCAT module cleaned up.\n");
-
- /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
+ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
+
+ printk(KERN_INFO "Cleaning up RTL8139-EtherCAT module...\n");
+
+ if (rtl_ec_net_dev) {
+ printk(KERN_INFO "Stopping device...\n");
+ ecdev_stop(ec_device_master_index);
+ printk(KERN_INFO "Unregistering device...\n");
+ ecdev_unregister(ec_device_master_index, rtl_ec_dev);
+ rtl_ec_dev = NULL;
+ }
+
+ pci_unregister_driver(&rtl8139_pci_driver);
+
+ printk(KERN_INFO "RTL8139-EtherCAT module cleaned up.\n");
+
+ /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
}
--- a/devices/ecdev.h Thu Apr 20 13:19:36 2006 +0000
+++ b/devices/ecdev.h Thu Apr 20 13:31:31 2006 +0000
@@ -1,8 +1,8 @@
/******************************************************************************
*
- * Oeffentliche EtherCAT-Schnittstellen fuer EtherCAT-Geraetetreiber.
+ * EtherCAT interface for EtherCAT device drivers.
*
- * $Id$
+ * $Id$
*
*****************************************************************************/
--- a/include/ecrt.h Thu Apr 20 13:19:36 2006 +0000
+++ b/include/ecrt.h Thu Apr 20 13:31:31 2006 +0000
@@ -1,6 +1,6 @@
/******************************************************************************
*
- * Oeffentliche EtherCAT-Schnittstellen fuer Echtzeitprozesse.
+ * EtherCAT realtime interface.
*
* $Id$
*
--- a/master/canopen.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/canopen.c Thu Apr 20 13:31:31 2006 +0000
@@ -28,14 +28,14 @@
/*****************************************************************************/
/**
- Liest 32 Bit eines CANopen-SDOs im Expedited-Modus aus einem Slave.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ec_slave_sdo_read_exp(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint8_t *target /**< Speicher für 4 Bytes */
+ Reads 32 bit of a CANopen SDO in expedited mode.
+ \return 0 in case of success, else < 0
+ */
+
+int ec_slave_sdo_read_exp(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint8_t *target /**< 4-byte memory */
)
{
size_t rec_size;
@@ -45,14 +45,14 @@
EC_WRITE_U16(data, 0x2 << 12); // SDO request
EC_WRITE_U8 (data + 2, (0x1 << 1 // expedited transfer
- | 0x2 << 5)); // initiate upload request
+ | 0x2 << 5)); // initiate upload request
EC_WRITE_U16(data + 3, sdo_index);
EC_WRITE_U8 (data + 5, sdo_subindex);
if (!(data = ec_slave_mbox_simple_io(slave, &rec_size))) return -1;
if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request
- EC_READ_U8 (data + 2) >> 5 == 0x4) { // Abort SDO transfer request
+ EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request
EC_ERR("SDO upload 0x%04X:%X aborted on slave %i.\n",
sdo_index, sdo_subindex, slave->ring_position);
ec_canopen_abort_msg(EC_READ_U32(data + 6));
@@ -60,9 +60,9 @@
}
if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response
- EC_READ_U8 (data + 2) >> 5 != 0x2 || // Upload response
- EC_READ_U16(data + 3) != sdo_index || // Index
- EC_READ_U8 (data + 5) != sdo_subindex) { // Subindex
+ EC_READ_U8 (data + 2) >> 5 != 0x2 || // upload response
+ EC_READ_U16(data + 3) != sdo_index || // index
+ EC_READ_U8 (data + 5) != sdo_subindex) { // subindex
EC_ERR("SDO upload 0x%04X:%X failed:\n", sdo_index, sdo_subindex);
EC_ERR("Invalid SDO upload response at slave %i!\n",
slave->ring_position);
@@ -77,14 +77,14 @@
/*****************************************************************************/
/**
- Beschreibt ein CANopen-SDO eines Slaves im Expedited-Modus.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ec_slave_sdo_write_exp(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- const uint8_t *sdo_data, /**< Neuer Wert */
+ Writes a CANopen SDO using expedited mode.
+ \return 0 in case of success, else < 0
+ */
+
+int ec_slave_sdo_write_exp(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ const uint8_t *sdo_data, /**< new value */
size_t size
)
{
@@ -111,7 +111,7 @@
if (!(data = ec_slave_mbox_simple_io(slave, &rec_size))) return -1;
if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request
- EC_READ_U8 (data + 2) >> 5 == 0x4) { // Abort SDO transfer request
+ EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request
EC_ERR("SDO download 0x%04X:%X (%i bytes) aborted on slave %i.\n",
sdo_index, sdo_subindex, size, slave->ring_position);
ec_canopen_abort_msg(EC_READ_U32(data + 6));
@@ -119,9 +119,9 @@
}
if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response
- EC_READ_U8 (data + 2) >> 5 != 0x3 || // Download response
- EC_READ_U16(data + 3) != sdo_index || // Index
- EC_READ_U8 (data + 5) != sdo_subindex) { // Subindex
+ EC_READ_U8 (data + 2) >> 5 != 0x3 || // download response
+ EC_READ_U16(data + 3) != sdo_index || // index
+ EC_READ_U8 (data + 5) != sdo_subindex) { // subindex
EC_ERR("SDO download 0x%04X:%X (%i bytes) failed:\n",
sdo_index, sdo_subindex, size);
EC_ERR("Invalid SDO download response at slave %i!\n",
@@ -136,15 +136,17 @@
/*****************************************************************************/
/**
- Liest ein CANopen-SDO im "Normal-Modus" aus einem Slave.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint8_t *target, /**< Speicher für gel. Wert */
- size_t *size /**< Größe des Speichers */
+ Reads a CANopen SDO in normal mode.
+ \return 0 in case of success, else < 0
+
+ \todo size
+ */
+
+int ecrt_slave_sdo_read(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint8_t *target, /**< memory for value */
+ size_t *size /**< target memory size */
)
{
uint8_t *data;
@@ -161,7 +163,7 @@
if (!(data = ec_slave_mbox_simple_io(slave, &rec_size))) return -1;
if (EC_READ_U16(data) >> 12 == 0x2 && // SDO request
- EC_READ_U8 (data + 2) >> 5 == 0x4) { // Abort SDO transfer request
+ EC_READ_U8 (data + 2) >> 5 == 0x4) { // abort SDO transfer request
EC_ERR("SDO upload 0x%04X:%X aborted on slave %i.\n",
sdo_index, sdo_subindex, slave->ring_position);
ec_canopen_abort_msg(EC_READ_U32(data + 6));
@@ -169,9 +171,9 @@
}
if (EC_READ_U16(data) >> 12 != 0x3 || // SDO response
- EC_READ_U8 (data + 2) >> 5 != 0x2 || // Initiate upload response
- EC_READ_U16(data + 3) != sdo_index || // Index
- EC_READ_U8 (data + 5) != sdo_subindex) { // Subindex
+ EC_READ_U8 (data + 2) >> 5 != 0x2 || // initiate upload response
+ EC_READ_U16(data + 3) != sdo_index || // index
+ EC_READ_U8 (data + 5) != sdo_subindex) { // subindex
EC_ERR("SDO upload 0x%04X:%X failed:\n", sdo_index, sdo_subindex);
EC_ERR("Invalid SDO upload response at slave %i!\n",
slave->ring_position);
@@ -205,11 +207,11 @@
/*****************************************************************************/
/**
- Lädt das gesamte SDO-Dictionary aus einem Slave.
- \return 0, wenn alles ok, sonst < 0
+ Fetches the SDO dictionary of a slave.
+ \return 0 in case of success, else < 0
*/
-int ec_slave_fetch_sdo_list(ec_slave_t *slave /**< EtherCAT-Slave */)
+int ec_slave_fetch_sdo_list(ec_slave_t *slave /**< EtherCAT slave */)
{
uint8_t *data;
size_t rec_size;
@@ -223,7 +225,7 @@
EC_WRITE_U8 (data + 2, 0x01); // Get OD List Request
EC_WRITE_U8 (data + 3, 0x00);
EC_WRITE_U16(data + 4, 0x0000);
- EC_WRITE_U16(data + 6, 0x0001); // Deliver all SDOs!
+ EC_WRITE_U16(data + 6, 0x0001); // deliver all SDOs!
if (unlikely(ec_master_simple_io(slave->master, &slave->mbox_command))) {
EC_ERR("Mailbox checking failed on slave %i!\n", slave->ring_position);
@@ -235,7 +237,7 @@
return -1;
if (EC_READ_U16(data) >> 12 == 0x8 && // SDO information
- (EC_READ_U8(data + 2) & 0x7F) == 0x07) { // Error response
+ (EC_READ_U8(data + 2) & 0x7F) == 0x07) { // error response
EC_ERR("SDO information error response at slave %i!\n",
slave->ring_position);
ec_canopen_abort_msg(EC_READ_U32(data + 6));
@@ -259,7 +261,7 @@
sdo_count = (rec_size - 8) / 2;
for (i = 0; i < sdo_count; i++) {
sdo_index = EC_READ_U16(data + 8 + i * 2);
- if (!sdo_index) continue; // Manchmal ist der Index 0... ???
+ if (!sdo_index) continue; // sometimes index is 0... ???
if (!(sdo = (ec_sdo_t *) kmalloc(sizeof(ec_sdo_t), GFP_KERNEL))) {
EC_ERR("Failed to allocate memory for SDO!\n");
@@ -278,7 +280,7 @@
}
while (EC_READ_U8(data + 2) & 0x80);
- // Alle Beschreibungen laden
+ // Fetch all SDO descriptions
if (ec_slave_fetch_sdo_descriptions(slave)) return -1;
return 0;
@@ -287,11 +289,11 @@
/*****************************************************************************/
/**
- Holt die Beschreibungen zu allen bereits bekannten SDOs.
- \return 0, wenn alles ok, sonst < 0
+ Fetches the SDO descriptions for the known SDOs.
+ \return 0 in case of success, else < 0
*/
-int ec_slave_fetch_sdo_descriptions(ec_slave_t *slave /**< EtherCAT-Slave */)
+int ec_slave_fetch_sdo_descriptions(ec_slave_t *slave /**< EtherCAT slave */)
{
uint8_t *data;
size_t rec_size, name_size;
@@ -308,7 +310,7 @@
if (!(data = ec_slave_mbox_simple_io(slave, &rec_size))) return -1;
if (EC_READ_U16(data) >> 12 == 0x8 && // SDO information
- (EC_READ_U8 (data + 2) & 0x7F) == 0x07) { // Error response
+ (EC_READ_U8 (data + 2) & 0x7F) == 0x07) { // error response
EC_ERR("SDO information error response at slave %i while"
" fetching SDO 0x%04X!\n", slave->ring_position,
sdo->index);
@@ -354,7 +356,7 @@
return -1;
}
- // Alle Entries (Subindizes) laden
+ // Fetch all entries (subindices)
if (ec_slave_fetch_sdo_entries(slave, sdo, EC_READ_U8(data + 10)))
return -1;
}
@@ -365,13 +367,13 @@
/*****************************************************************************/
/**
- Lädt alle Entries (Subindizes) zu einem SDO.
- \return 0, wenn alles ok, sonst < 0
+ Fetches all entries (subindices) to an SDO.
+ \return 0 in case of success, else < 0
*/
-int ec_slave_fetch_sdo_entries(ec_slave_t *slave, /**< EtherCAT-Slave */
+int ec_slave_fetch_sdo_entries(ec_slave_t *slave, /**< EtherCAT slave */
ec_sdo_t *sdo, /**< SDO */
- uint8_t subindices /**< Anzahl Subindizes */
+ uint8_t subindices /**< number of subindices */
)
{
uint8_t *data;
@@ -394,7 +396,7 @@
if (!(data = ec_slave_mbox_simple_io(slave, &rec_size))) return -1;
if (EC_READ_U16(data) >> 12 == 0x8 && // SDO information
- (EC_READ_U8 (data + 2) & 0x7F) == 0x07) { // Error response
+ (EC_READ_U8 (data + 2) & 0x7F) == 0x07) { // error response
EC_ERR("SDO information error response at slave %i while"
" fetching SDO entry 0x%04X:%i!\n", slave->ring_position,
sdo->index, i);
@@ -403,7 +405,7 @@
}
if (EC_READ_U16(data) >> 12 != 0x8 || // SDO information
- (EC_READ_U8(data + 2) & 0x7F) != 0x06 || // entry descr. response
+ (EC_READ_U8(data + 2) & 0x7F) != 0x06 || // Entry desc. response
EC_READ_U16(data + 6) != sdo->index || // SDO index
EC_READ_U8(data + 8) != i) { // SDO subindex
EC_ERR("Invalid entry description response at slave %i while"
@@ -449,7 +451,7 @@
/*****************************************************************************/
/**
- Gibt eine SDO-Abort-Meldung aus.
+ Outputs an SDO abort message.
*/
void ec_canopen_abort_msg(uint32_t abort_code)
@@ -506,21 +508,20 @@
{}
};
-/*****************************************************************************/
-// Echtzeitschnittstelle
-
-/*****************************************************************************/
-
-/**
- Liest ein 8-Bit CANopen-SDO im Expedited-Modus aus einem Slave.
- Siehe ec_slave_sdo_read_exp()
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_read_exp8(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint8_t *target /**< Speicher für gel. Wert */
+/******************************************************************************
+ * Realtime interface
+ *****************************************************************************/
+
+/**
+ Reads an 8-bit SDO in expedited mode.
+ See ec_slave_sdo_read_exp()
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_read_exp8(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint8_t *target /**< memory for read value */
)
{
uint8_t data[4];
@@ -532,15 +533,15 @@
/*****************************************************************************/
/**
- Liest ein 16-Bit CANopen-SDO im Expedited-Modus aus einem Slave.
- Siehe ec_slave_sdo_read_exp()
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_read_exp16(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint16_t *target /**< Speicher für gel. Wert */
+ Reads a 16-bit SDO in expedited mode.
+ See ec_slave_sdo_read_exp()
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_read_exp16(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint16_t *target /**< memory for read value */
)
{
uint8_t data[4];
@@ -552,15 +553,15 @@
/*****************************************************************************/
/**
- Liest ein 32-Bit CANopen-SDO im Expedited-Modus aus einem Slave.
- Siehe ec_slave_sdo_read_exp()
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_read_exp32(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint32_t *target /**< Speicher für gel. Wert */
+ Reads a 32-bit SDO in expedited mode.
+ See ec_slave_sdo_read_exp()
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_read_exp32(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint32_t *target /**< memory for read value */
)
{
uint8_t data[4];
@@ -572,14 +573,14 @@
/*****************************************************************************/
/**
- Beschreibt ein 8-Bit CANopen-SDO eines Slaves im Expedited-Modus.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_write_exp8(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint8_t value /**< Neuer Wert */
+ Writes an 8-bit SDO in expedited mode.
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_write_exp8(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint8_t value /**< new value */
)
{
return ec_slave_sdo_write_exp(slave, sdo_index, sdo_subindex, &value, 1);
@@ -588,14 +589,14 @@
/*****************************************************************************/
/**
- Beschreibt ein 16-Bit CANopen-SDO eines Slaves im Expedited-Modus.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_write_exp16(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint16_t value /**< Neuer Wert */
+ Writes a 16-bit SDO in expedited mode.
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_write_exp16(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint16_t value /**< new value */
)
{
uint8_t data[2];
@@ -606,14 +607,14 @@
/*****************************************************************************/
/**
- Beschreibt ein 32-Bit CANopen-SDO eines Slaves im Expedited-Modus.
- \return 0 wenn alles ok, < 0 bei Fehler
- */
-
-int ecrt_slave_sdo_write_exp32(ec_slave_t *slave, /**< EtherCAT-Slave */
- uint16_t sdo_index, /**< SDO-Index */
- uint8_t sdo_subindex, /**< SDO-Subindex */
- uint32_t value /**< Neuer Wert */
+ Writes a 32-bit SDO in expedited mode.
+ \return 0 in case of success, else < 0
+ */
+
+int ecrt_slave_sdo_write_exp32(ec_slave_t *slave, /**< EtherCAT slave */
+ uint16_t sdo_index, /**< SDO index */
+ uint8_t sdo_subindex, /**< SDO subindex */
+ uint32_t value /**< new value */
)
{
uint8_t data[4];
@@ -632,9 +633,3 @@
EXPORT_SYMBOL(ecrt_slave_sdo_read);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/command.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/command.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* c o m m a n d . c
*
- * Methoden für ein EtherCAT-Kommando.
+ * Methods of an EtherCAT command.
*
* $Id$
*
@@ -31,7 +31,7 @@
/*****************************************************************************/
/**
- EtherCAT-Kommando-Konstruktor.
+ Command constructor.
*/
void ec_command_init(ec_command_t *command)
@@ -49,7 +49,7 @@
/*****************************************************************************/
/**
- EtherCAT-Kommando-Destruktor.
+ Command destructor.
*/
void ec_command_clear(ec_command_t *command)
@@ -60,7 +60,8 @@
/*****************************************************************************/
/**
- Alloziert Speicher.
+ Allocates command data memory.
+ \return 0 in case of success, else < 0
*/
int ec_command_prealloc(ec_command_t *command, size_t size)
@@ -85,19 +86,19 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-NPRD-Kommando.
-
+ Initializes an EtherCAT NPRD command.
Node-adressed physical read.
+ \return 0 in case of success, else < 0
*/
int ec_command_nprd(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t node_address,
- /**< Adresse des Knotens (Slaves) */
- uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
- size_t data_size
- /**< Länge der zu lesenden Daten */
+ /**< configured station address */
+ uint16_t offset,
+ /**< physical memory address */
+ size_t data_size
+ /**< number of bytes to read */
)
{
if (unlikely(node_address == 0x0000))
@@ -113,19 +114,19 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-NPWR-Kommando.
-
+ Initializes an EtherCAT NPWR command.
Node-adressed physical write.
+ \return 0 in case of success, else < 0
*/
int ec_command_npwr(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t node_address,
- /**< Adresse des Knotens (Slaves) */
- uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
- size_t data_size
- /**< Länge der zu schreibenden Daten */
+ /**< configured station address */
+ uint16_t offset,
+ /**< physical memory address */
+ size_t data_size
+ /**< number of bytes to write */
)
{
if (unlikely(node_address == 0x0000))
@@ -141,19 +142,19 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-APRD-Kommando.
-
+ Initializes an EtherCAT APRD command.
Autoincrement physical read.
+ \return 0 in case of success, else < 0
*/
int ec_command_aprd(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t ring_position,
- /**< Position des Slaves im Bus */
- uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
- size_t data_size
- /**< Länge der zu lesenden Daten */
+ /**< auto-increment position */
+ uint16_t offset,
+ /**< physical memory address */
+ size_t data_size
+ /**< number of bytes to read */
)
{
EC_FUNC_HEADER;
@@ -166,19 +167,19 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-APWR-Kommando.
-
+ Initializes an EtherCAT APWR command.
Autoincrement physical write.
+ \return 0 in case of success, else < 0
*/
int ec_command_apwr(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t ring_position,
- /**< Position des Slaves im Bus */
- uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
- size_t data_size
- /**< Länge der zu schreibenden Daten */
+ /**< auto-increment position */
+ uint16_t offset,
+ /**< physical memory address */
+ size_t data_size
+ /**< number of bytes to write */
)
{
EC_FUNC_HEADER;
@@ -191,17 +192,17 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-BRD-Kommando.
-
+ Initializes an EtherCAT BRD command.
Broadcast read.
+ \return 0 in case of success, else < 0
*/
int ec_command_brd(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
+ /**< physical memory address */
size_t data_size
- /**< Länge der zu lesenden Daten */
+ /**< number of bytes to read */
)
{
EC_FUNC_HEADER;
@@ -214,17 +215,17 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-BWR-Kommando.
-
+ Initializes an EtherCAT BWR command.
Broadcast write.
+ \return 0 in case of success, else < 0
*/
int ec_command_bwr(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint16_t offset,
- /**< Physikalische Speicheradresse im Slave */
+ /**< physical memory address */
size_t data_size
- /**< Länge der zu schreibenden Daten */
+ /**< number of bytes to write */
)
{
EC_FUNC_HEADER;
@@ -237,17 +238,17 @@
/*****************************************************************************/
/**
- Initialisiert ein EtherCAT-LRW-Kommando.
-
+ Initializes an EtherCAT LRW command.
Logical read write.
+ \return 0 in case of success, else < 0
*/
int ec_command_lrw(ec_command_t *command,
- /**< EtherCAT-Rahmen */
+ /**< EtherCAT command */
uint32_t offset,
- /**< Logische Startadresse */
+ /**< logical address */
size_t data_size
- /**< Länge der zu lesenden/schreibenden Daten */
+ /**< number of bytes to read/write */
)
{
EC_FUNC_HEADER;
@@ -257,9 +258,3 @@
}
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/command.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/command.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* c o m m a n d . h
*
- * Struktur für ein EtherCAT-Kommando.
+ * EtherCAT command structure.
*
* $Id$
*
@@ -18,7 +18,7 @@
/*****************************************************************************/
/**
- EtherCAT-Kommando-Typ.
+ EtherCAT command type.
*/
typedef enum
@@ -35,65 +35,57 @@
ec_command_type_t;
/**
- EtherCAT-Kommando-Zustand.
+ EtherCAT command state.
*/
typedef enum
{
- EC_CMD_INIT, /**< Neues Kommando */
- EC_CMD_QUEUED, /**< Kommando in Warteschlange */
- EC_CMD_SENT, /**< Kommando gesendet */
- EC_CMD_RECEIVED, /**< Kommando empfangen */
- EC_CMD_TIMEOUT, /**< Zeitgrenze überschritten */
- EC_CMD_ERROR /**< Fehler beim Senden oder Empfangen */
+ EC_CMD_INIT, /**< new command */
+ EC_CMD_QUEUED, /**< command queued by master */
+ EC_CMD_SENT, /**< command has been sent */
+ EC_CMD_RECEIVED, /**< command has been received */
+ EC_CMD_TIMEOUT, /**< command timed out */
+ EC_CMD_ERROR /**< error while sending/receiving */
}
ec_command_state_t;
/*****************************************************************************/
/**
- EtherCAT-Adresse.
-
- Im EtherCAT-Kommando sind 4 Bytes für die Adresse reserviert, die je nach
- Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen
- sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten-
- adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und
- vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse
- auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes
- der logischen Adresse.
+ EtherCAT address.
*/
typedef union
{
struct
{
- uint16_t slave; /**< Adresse des Slaves (Ringposition oder Knoten) */
- uint16_t mem; /**< Physikalische Speicheradresse im Slave */
+ uint16_t slave; /**< configured or autoincrement address */
+ uint16_t mem; /**< physical memory address */
}
- physical; /**< Physikalische Adresse */
+ physical; /**< physical address */
- uint32_t logical; /**< Logische Adresse */
+ uint32_t logical; /**< logical address */
}
ec_address_t;
/*****************************************************************************/
/**
- EtherCAT-Kommando.
+ EtherCAT command
*/
typedef struct
{
- struct list_head list; /**< Kommando-Listeneintrag */
- struct list_head queue; /**< Master-Kommando-Queue */
- ec_command_type_t type; /**< Typ des Kommandos (APRD, NPWR, etc) */
- ec_address_t address; /**< Adresse des/der Empfänger */
- uint8_t *data; /**< Kommandodaten */
- size_t mem_size; /**< Größe des Speichers */
- size_t data_size; /**< Länge der zu sendenden und/oder empfangenen Daten */
- uint8_t index; /**< Kommando-Index, wird vom Master beim Senden gesetzt. */
- uint16_t working_counter; /**< Working-Counter */
- ec_command_state_t state; /**< Zustand */
+ struct list_head list; /**< needed by domain command lists */
+ struct list_head queue; /**< master command queue item */
+ ec_command_type_t type; /**< command type (APRD, BWR, etc) */
+ ec_address_t address; /**< receipient address */
+ uint8_t *data; /**< command data */
+ size_t mem_size; /**< command \a data memory size */
+ size_t data_size; /**< size of the data in \a data */
+ uint8_t index; /**< command index (set by master) */
+ uint16_t working_counter; /**< working counter */
+ ec_command_state_t state; /**< command state */
}
ec_command_t;
@@ -113,9 +105,3 @@
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/device.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/device.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* d e v i c e . c
*
- * Methoden für ein EtherCAT-Gerät.
+ * EtherCAT device methods.
*
* $Id$
*
@@ -20,16 +20,15 @@
/*****************************************************************************/
/**
- 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 */
- ec_master_t *master, /**< Zugehöriger Master */
- struct net_device *net_dev, /**< Net-Device */
- ec_isr_t isr, /**< Adresse der ISR */
- struct module *module /**< Modul-Adresse */
+ Device constructor.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_device_init(ec_device_t *device, /**< EtherCAT device */
+ ec_master_t *master, /**< master owning the device */
+ struct net_device *net_dev, /**< net_device structure */
+ ec_isr_t isr, /**< pointer to device's ISR */
+ struct module *module /**< pointer to the owning module */
)
{
struct ethhdr *eth;
@@ -49,7 +48,7 @@
device->tx_skb->dev = net_dev;
- // Ethernet-II-Header hinzufuegen
+ // add Ethernet-II-header
skb_reserve(device->tx_skb, ETH_HLEN);
eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN);
eth->h_proto = htons(0x88A4);
@@ -62,13 +61,10 @@
/*****************************************************************************/
/**
- EtherCAT-Geräte-Destuktor.
-
- Gibt den dynamisch allozierten Speicher des
- EtherCAT-Gerätes (den Sende-Socket-Buffer) wieder frei.
-*/
-
-void ec_device_clear(ec_device_t *device /**< EtherCAT-Gerät */)
+ EtherCAT device destuctor.
+*/
+
+void ec_device_clear(ec_device_t *device /**< EtherCAT device */)
{
if (device->open) ec_device_close(device);
if (device->tx_skb) dev_kfree_skb(device->tx_skb);
@@ -77,17 +73,11 @@
/*****************************************************************************/
/**
- Führt die open()-Funktion des Netzwerktreibers aus.
-
- Dies entspricht einem "ifconfig up". Vorher wird der Zeiger
- auf das EtherCAT-Gerät auf Gültigkeit geprüft und der
- Gerätezustand zurückgesetzt.
-
- \return 0 bei Erfolg, < 0: Ungültiger Zeiger, oder open()
- fehlgeschlagen
-*/
-
-int ec_device_open(ec_device_t *device /**< EtherCAT-Gerät */)
+ Opens the EtherCAT device.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_device_open(ec_device_t *device /**< EtherCAT device */)
{
unsigned int i;
@@ -101,7 +91,7 @@
return 0;
}
- // Device could have received frames before
+ // device could have received frames before
for (i = 0; i < 4; i++) ec_device_call_isr(device);
device->link_state = 0;
@@ -114,13 +104,11 @@
/*****************************************************************************/
/**
- Führt die stop()-Funktion des net_devices aus.
-
- \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 */)
+ Stops the EtherCAT device.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_device_close(ec_device_t *device /**< EtherCAT device */)
{
if (!device->dev) {
EC_ERR("No device to close!\n");
@@ -140,12 +128,11 @@
/*****************************************************************************/
/**
- Liefert einen Zeiger auf den Sende-Speicher.
-
- \return Zeiger auf den Speicher, in den die Frame-Daten sollen.
-*/
-
-uint8_t *ec_device_tx_data(ec_device_t *device /**< EtherCAT-Gerät */)
+ Returns a pointer to the device's transmit memory.
+ \return pointer to the TX socket buffer
+*/
+
+uint8_t *ec_device_tx_data(ec_device_t *device /**< EtherCAT device */)
{
return device->tx_skb->data + ETH_HLEN;
}
@@ -153,21 +140,19 @@
/*****************************************************************************/
/**
- Sendet den Inhalt des Socket-Buffers.
-
- 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 */
- size_t size /**< Größe der zu sendenden Daten */
+ Sends the content of the transmit socket buffer.
+ Cuts the socket buffer content to the (now known) size, and calls the
+ start_xmit() function of the assigned net_device.
+*/
+
+void ec_device_send(ec_device_t *device, /**< EtherCAT device */
+ size_t size /**< number of bytes to send */
)
{
if (unlikely(!device->link_state)) // Link down
return;
- // Framegröße auf (jetzt bekannte) Länge abschneiden
+ // set the right length for the data
device->tx_skb->len = ETH_HLEN + size;
if (unlikely(device->master->debug_level > 1)) {
@@ -175,36 +160,33 @@
ec_print_data(device->tx_skb->data + ETH_HLEN, size);
}
- // Senden einleiten
+ // start sending
device->dev->hard_start_xmit(device->tx_skb, device->dev);
}
/*****************************************************************************/
/**
- Ruft die Interrupt-Routine der Netzwerkkarte auf.
-*/
-
-void ec_device_call_isr(ec_device_t *device /**< EtherCAT-Gerät */)
+ Calls the interrupt service routine of the assigned net_device.
+*/
+
+void ec_device_call_isr(ec_device_t *device /**< EtherCAT device */)
{
if (likely(device->isr)) device->isr(0, device->dev, NULL);
}
/******************************************************************************
- *
- * Treiberschnittstelle
- *
+ * Device interface
*****************************************************************************/
/**
- Nimmt einen Empfangenen Rahmen entgegen.
-
- Kopiert die empfangenen Daten in den Receive-Buffer.
-*/
-
-void ecdev_receive(ec_device_t *device, /**< EtherCAT-Gerät */
- const void *data, /**< Zeiger auf empfangene Daten */
- size_t size /**< Größe der empfangenen Daten */
+ Accepts a received frame.
+ Forwards the received data to the master.
+*/
+
+void ecdev_receive(ec_device_t *device, /**< EtherCAT device */
+ const void *data, /**< pointer to receibed data */
+ size_t size /**< number of bytes received */
)
{
if (unlikely(device->master->debug_level > 1)) {
@@ -218,11 +200,11 @@
/*****************************************************************************/
/**
- Setzt einen neuen Verbindungszustand.
-*/
-
-void ecdev_link_state(ec_device_t *device, /**< EtherCAT-Gerät */
- uint8_t state /**< Verbindungszustand */
+ Sets a new link state.
+*/
+
+void ecdev_link_state(ec_device_t *device, /**< EtherCAT device */
+ uint8_t state /**< new link state */
)
{
if (unlikely(!device)) {
@@ -242,9 +224,3 @@
EXPORT_SYMBOL(ecdev_link_state);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/device.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/device.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* d e v i c e . h
*
- * Struktur für ein EtherCAT-Gerät.
+ * EtherCAT device structure.
*
* $Id$
*
@@ -20,23 +20,21 @@
/*****************************************************************************/
/**
- EtherCAT-Gerät.
+ EtherCAT device.
- Ein EtherCAT-Gerät ist eine Netzwerkkarte, die vom
- EtherCAT-Master dazu verwendet wird, um Frames zu senden
- und zu empfangen.
+ An EtherCAT device is a network interface card, that is owned by an
+ EtherCAT master to send and receive EtherCAT frames with.
*/
struct ec_device
{
- ec_master_t *master; /**< EtherCAT-Master */
- struct net_device *dev; /**< Zeiger auf das reservierte net_device */
- uint8_t open; /**< Das net_device ist geoeffnet. */
- struct sk_buff *tx_skb; /**< Zeiger auf Transmit-Socketbuffer */
- ec_isr_t isr; /**< Adresse der ISR */
- struct module *module; /**< Zeiger auf das Modul, das das Gerät zur
- Verfügung stellt. */
- uint8_t link_state; /**< Verbindungszustand */
+ ec_master_t *master; /**< EtherCAT master */
+ struct net_device *dev; /**< pointer to the assigned net_device */
+ uint8_t open; /**< true, if the net_device has been opened */
+ struct sk_buff *tx_skb; /**< transmit socket buffer */
+ ec_isr_t isr; /**< pointer to the device's interrupt service routine */
+ struct module *module; /**< pointer to the device's owning module */
+ uint8_t link_state; /**< device link state */
};
/*****************************************************************************/
@@ -55,9 +53,3 @@
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/domain.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/domain.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* d o m a i n . c
*
- * Methoden für Gruppen von EtherCAT-Slaves.
+ * EtherCAT domain methods.
*
* $Id$
*
@@ -40,12 +40,13 @@
/*****************************************************************************/
/**
- Konstruktor einer EtherCAT-Domäne.
-*/
-
-int ec_domain_init(ec_domain_t *domain, /**< Domäne */
- ec_master_t *master, /**< Zugehöriger Master */
- unsigned int index /**< Domänen-Index */
+ Domain constructor.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_domain_init(ec_domain_t *domain, /**< EtherCAT domain */
+ ec_master_t *master, /**< owning master */
+ unsigned int index /**< domain index */
)
{
domain->master = master;
@@ -57,7 +58,7 @@
INIT_LIST_HEAD(&domain->field_regs);
INIT_LIST_HEAD(&domain->commands);
- // Init kobject and add it to the hierarchy
+ // init kobject and add it to the hierarchy
memset(&domain->kobj, 0x00, sizeof(struct kobject));
kobject_init(&domain->kobj);
domain->kobj.ktype = &ktype_ec_domain;
@@ -73,10 +74,10 @@
/*****************************************************************************/
/**
- Destruktor einer EtherCAT-Domäne.
-*/
-
-void ec_domain_clear(struct kobject *kobj /**< Kobject der Domäne */)
+ Domain destructor.
+*/
+
+void ec_domain_clear(struct kobject *kobj /**< kobject of the domain */)
{
ec_command_t *command, *next;
ec_domain_t *domain;
@@ -98,16 +99,16 @@
/*****************************************************************************/
/**
- Registriert ein Feld in einer Domäne.
-
- \return 0 bei Erfolg, < 0 bei Fehler
-*/
-
-int ec_domain_reg_field(ec_domain_t *domain, /**< Domäne */
- ec_slave_t *slave, /**< Slave */
- const ec_sync_t *sync, /**< Sync-Manager */
- uint32_t field_offset, /**< Datenfeld-Offset */
- void **data_ptr /**< Adresse des Prozessdatenzeigers */
+ Registeres a data field in a domain.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_domain_reg_field(ec_domain_t *domain, /**< EtherCAT domain */
+ ec_slave_t *slave, /**< slave */
+ const ec_sync_t *sync, /**< sync manager */
+ uint32_t field_offset, /**< data field offset */
+ void **data_ptr /**< pointer to the process data
+ pointer */
)
{
ec_field_reg_t *field_reg;
@@ -136,10 +137,10 @@
/*****************************************************************************/
/**
- Gibt die Liste der registrierten Datenfelder frei.
-*/
-
-void ec_domain_clear_field_regs(ec_domain_t *domain)
+ Clears the list of the registered data fields.
+*/
+
+void ec_domain_clear_field_regs(ec_domain_t *domain /**< EtherCAT domain */)
{
ec_field_reg_t *field_reg, *next;
@@ -152,12 +153,13 @@
/*****************************************************************************/
/**
- Alloziert ein Prozessdatenkommando und fügt es in die Liste ein.
-*/
-
-int ec_domain_add_command(ec_domain_t *domain, /**< Domäne */
- uint32_t offset, /**< Logisches Offset */
- size_t data_size /**< Größe der Kommando-Daten */
+ Allocates a process data command and appends it to the list.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_domain_add_command(ec_domain_t *domain, /**< EtherCAT domain */
+ uint32_t offset, /**< logical offset */
+ size_t data_size /**< size of the command data */
)
{
ec_command_t *command;
@@ -181,15 +183,14 @@
/*****************************************************************************/
/**
- 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 */
+ Creates a domain.
+ Reserves domain memory, calculates the logical addresses of the
+ corresponding FMMUs and sets the process data pointer of the registered
+ data fields.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_domain_alloc(ec_domain_t *domain, /**< EtherCAT domain */
uint32_t base_address /**< Logische Basisadresse */
)
{
@@ -276,30 +277,33 @@
/*****************************************************************************/
/**
- Gibt die Anzahl der antwortenden Slaves aus.
-*/
-
-void ec_domain_response_count(ec_domain_t *domain, /**< Domäne */
- unsigned int count /**< Neue Anzahl */
+ Sets the number of responding slaves and outputs it on demand.
+ This number isn't really the number of responding slaves, but the sum of
+ the working counters of all domain commands. Some slaves increase the
+ working counter by 2, some by 1.
+*/
+
+void ec_domain_response_count(ec_domain_t *domain, /**< EtherCAT domain */
+ unsigned int count /**< new WC sum */
)
{
if (count != domain->response_count) {
domain->response_count = count;
- EC_INFO("Domain %i working counter change: %i\n", domain->index, count);
- }
-}
-
-/*****************************************************************************/
-
-/**
- Formatiert Attribut-Daten für lesenden Zugriff im SysFS
-
- \return Anzahl Bytes im Speicher
-*/
-
-ssize_t ec_show_domain_attribute(struct kobject *kobj, /**< KObject */
- struct attribute *attr, /**< Attribut */
- char *buffer /**< Speicher für die Daten */
+ EC_INFO("Domain %i working counter change: %i\n", domain->index,
+ count);
+ }
+}
+
+/*****************************************************************************/
+
+/**
+ Formats attribute data for SysFS reading.
+ \return number of bytes to read
+*/
+
+ssize_t ec_show_domain_attribute(struct kobject *kobj, /**< kobject */
+ struct attribute *attr, /**< attribute */
+ char *buffer /**< memory to store data in */
)
{
ec_domain_t *domain = container_of(kobj, ec_domain_t, kobj);
@@ -312,43 +316,39 @@
}
/******************************************************************************
- *
- * Echtzeitschnittstelle
- *
+ * Realtime interface
*****************************************************************************/
/**
- Registriert ein Datenfeld innerhalb einer Domäne.
-
- - Ist \a data_ptr NULL, so wird der Slave nur auf den Typ überprüft.
- - Wenn \a field_count 0 ist, wird angenommen, dass 1 Feld registriert werden
- soll.
- - Wenn \a field_count größer als 1 ist, wird angenommen, dass \a data_ptr
- auf ein entsprechend großes Array zeigt.
-
- \return Zeiger auf den Slave bei Erfolg, sonst NULL
+ Registers a data field in a domain.
+ - If \a data_ptr is NULL, the slave is only checked against its type.
+ - If \a field_count is 0, it is assumed that one data field is to be
+ registered.
+ - If \a field_count is greater then 1, it is assumed that \a data_ptr
+ is an array of the respective size.
+ \return pointer to the slave on success, else NULL
*/
ec_slave_t *ecrt_domain_register_field(ec_domain_t *domain,
- /**< Domäne */
+ /**< EtherCAT domain */
const char *address,
- /**< ASCII-Addresse des Slaves,
- siehe ecrt_master_get_slave() */
+ /**< ASCII address of the slave,
+ see ecrt_master_get_slave() */
const char *vendor_name,
- /**< Herstellername */
+ /**< vendor name */
const char *product_name,
- /**< Produktname */
+ /**< product name */
void **data_ptr,
- /**< Adresse des Zeigers auf die
- Prozessdaten */
+ /**< address of the process data
+ pointer */
const char *field_name,
- /**< Name des Datenfeldes */
+ /**< data field name */
unsigned int field_index,
- /**< Gibt an, ab welchem Feld mit
- Typ \a field_type gezählt
- werden soll. */
+ /**< offset of data fields with
+ \a field_type */
unsigned int field_count
- /**< Anzahl Felder selben Typs */
+ /**< number of data fields (with
+ the same type) to register */
)
{
ec_slave_t *slave;
@@ -361,7 +361,7 @@
master = domain->master;
- // Adresse übersetzen
+ // translate address
if (!(slave = ecrt_master_get_slave(master, address))) return NULL;
if (!(type = slave->type)) {
@@ -379,7 +379,7 @@
}
if (!data_ptr) {
- // Wenn data_ptr NULL, Slave als registriert ansehen (nicht warnen).
+ // data_ptr is NULL => mark slave as "registered" (do not warn)
slave->registered = 1;
}
@@ -415,17 +415,15 @@
/*****************************************************************************/
/**
- Registriert eine ganze Liste von Datenfeldern innerhalb einer Domäne.
-
- Achtung: Die Liste muss mit einer NULL-Struktur ({}) abgeschlossen sein!
-
- \return 0 bei Erfolg, sonst < 0
+ Registeres a bunch of data fields.
+ Caution! The list has to be terminated with a NULL structure ({})!
+ \return 0 in case of success, else < 0
*/
int ecrt_domain_register_field_list(ec_domain_t *domain,
- /**< Domäne */
+ /**< EtherCAT domain */
const ec_field_init_t *fields
- /**< Array mit Datenfeldern */
+ /**< array of data field registrations */
)
{
const ec_field_init_t *field;
@@ -444,10 +442,10 @@
/*****************************************************************************/
/**
- Setzt Prozessdaten-Kommandos in die Warteschlange des Masters.
-*/
-
-void ecrt_domain_queue(ec_domain_t *domain /**< Domäne */)
+ Places all process data commands in the masters command queue.
+*/
+
+void ecrt_domain_queue(ec_domain_t *domain /**< EtherCAT domain */)
{
ec_command_t *command;
@@ -459,10 +457,10 @@
/*****************************************************************************/
/**
- Verarbeitet empfangene Prozessdaten.
-*/
-
-void ecrt_domain_process(ec_domain_t *domain /**< Domäne */)
+ Processes received process data.
+*/
+
+void ecrt_domain_process(ec_domain_t *domain /**< EtherCAT domain */)
{
unsigned int working_counter_sum;
ec_command_t *command;
@@ -481,12 +479,11 @@
/*****************************************************************************/
/**
- Gibt den Status einer Domäne zurück.
-
- \return 0 wenn alle Kommandos empfangen wurden, sonst -1.
-*/
-
-int ecrt_domain_state(ec_domain_t *domain /**< Domäne */)
+ Returns the state of a domain.
+ \return 0 if all commands were received, else -1.
+*/
+
+int ecrt_domain_state(ec_domain_t *domain /**< EtherCAT domain */)
{
ec_command_t *command;
@@ -506,9 +503,3 @@
EXPORT_SYMBOL(ecrt_domain_state);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/domain.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/domain.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* d o m a i n . h
*
- * Struktur für eine Gruppe von EtherCAT-Slaves.
+ * EtherCAT domain structure.
*
* $Id$
*
@@ -21,39 +21,38 @@
/*****************************************************************************/
/**
- Datenfeld-Konfiguration.
+ Data field registration type.
*/
typedef struct
{
- struct list_head list;
- ec_slave_t *slave;
- const ec_sync_t *sync;
- uint32_t field_offset;
- void **data_ptr;
+ struct list_head list; /**< list item */
+ ec_slave_t *slave; /**< slave */
+ const ec_sync_t *sync; /**< sync manager */
+ uint32_t field_offset; /**< data field offset */
+ void **data_ptr; /**< pointer to process data pointer(s) */
}
ec_field_reg_t;
/*****************************************************************************/
/**
- EtherCAT-Domäne
-
- Verwaltet die Prozessdaten und das hierfür nötige Kommando einer bestimmten
- Menge von Slaves.
+ EtherCAT domain.
+ Handles the process data and the therefore needed commands of a certain
+ group of slaves.
*/
struct ec_domain
{
- struct kobject kobj; /**< Kobject der Domäne */
- struct list_head list; /**< Listenkopf */
- unsigned int index; /**< Domänen-Index */
- ec_master_t *master; /**< EtherCAT-Master, zu der die Domäne gehört. */
- size_t data_size; /**< Größe der Prozessdaten */
- struct list_head commands; /**< EtherCAT-Kommandos für die Prozessdaten */
- uint32_t base_address; /**< Logische Basisaddresse der Domain */
- unsigned int response_count; /**< Anzahl antwortender Slaves */
- struct list_head field_regs; /**< Liste der Datenfeldregistrierungen */
+ struct kobject kobj; /**< kobject */
+ struct list_head list; /**< list item */
+ unsigned int index; /**< domain index (just a number) */
+ ec_master_t *master; /**< EtherCAT master owning the domain */
+ size_t data_size; /**< size of the process data */
+ struct list_head commands; /**< process data commands */
+ uint32_t base_address; /**< logical offset address of the process data */
+ unsigned int response_count; /**< number of responding slaves */
+ struct list_head field_regs; /**< data field registrations */
};
/*****************************************************************************/
@@ -65,9 +64,3 @@
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/ethernet.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/ethernet.c Thu Apr 20 13:31:31 2006 +0000
@@ -117,9 +117,3 @@
}
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/ethernet.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/ethernet.h Thu Apr 20 13:31:31 2006 +0000
@@ -43,9 +43,3 @@
void ec_eoe_print(const ec_eoe_t *);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/globals.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/globals.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* g l o b a l s . h
*
- * Globale Definitionen und Makros für das EtherCAT-Protokoll.
+ * Global definitions and macros.
*
* $Id$
*
@@ -16,21 +16,20 @@
/*****************************************************************************/
// EtherCAT-Protokoll
-#define EC_MAX_FRAME_SIZE 1500 /**< Maximale Größe eines EtherCAT-Frames ohne
- Ethernet-II-Header und -Prüfsumme */
-#define EC_MIN_FRAME_SIZE 46 /** Minimale Größe, s. o. */
-#define EC_FRAME_HEADER_SIZE 2 /**< Größe des EtherCAT-Frame-Headers */
-#define EC_COMMAND_HEADER_SIZE 10 /**< Größe eines EtherCAT-Kommando-Headers */
-#define EC_COMMAND_FOOTER_SIZE 2 /**< Größe eines EtherCAT-Kommando-Footers */
-#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_FRAME_SIZE 1500 /**< maximum size of an EtherCAT frame (without
+ header and CRC) */
+#define EC_MIN_FRAME_SIZE 46 /** ... minimum size */
+#define EC_FRAME_HEADER_SIZE 2 /**< size of an EtherCAT frame header */
+#define EC_COMMAND_HEADER_SIZE 10 /**< size of an EtherCAT command header */
+#define EC_COMMAND_FOOTER_SIZE 2 /**< size of an EtherCAT command footer */
+#define EC_SYNC_SIZE 8 /**< size of a sync manager configuration page */
+#define EC_FMMU_SIZE 16 /**< size of an FMMU configuration page */
+#define EC_MAX_FMMUS 16 /**< maximum number of FMMUs per 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
- bei einem Kommando pro
- Frame */
+ - EC_COMMAND_FOOTER_SIZE) /**< maximum data size of a
+ single command */
/*****************************************************************************/
@@ -59,16 +58,15 @@
/*****************************************************************************/
/**
- Code - Message Pair.
-
+ Code - Message pair.
Some EtherCAT commands support reading a status code to display a certain
message. This type allows to map a code to a message string.
*/
typedef struct
{
- uint32_t code; /**< Code */
- const char *message; /**< Message belonging to \a code */
+ uint32_t code; /**< code */
+ const char *message; /**< message belonging to \a code */
}
ec_code_msg_t;
@@ -76,8 +74,3 @@
#endif
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/mailbox.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/mailbox.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* m a i l b o x . c
*
- * Mailbox-Funktionen
+ * Mailbox functionality.
*
* $Id$
*
@@ -18,12 +18,13 @@
/*****************************************************************************/
/**
- Bereitet ein Mailbox-Send-Kommando vor.
- */
-
-uint8_t *ec_slave_mbox_prepare_send(ec_slave_t *slave, /**< Slave */
- uint8_t type, /**< Mailbox-Protokoll */
- size_t size /**< Datengröße */
+ Prepares a mailbox-send command.
+ \return pointer to mailbox command data
+*/
+
+uint8_t *ec_slave_mbox_prepare_send(ec_slave_t *slave, /**< slave */
+ uint8_t type, /**< mailbox protocol */
+ size_t size /**< size of the data */
)
{
ec_command_t *command = &slave->mbox_command;
@@ -46,10 +47,10 @@
slave->sii_rx_mailbox_size))
return NULL;
- EC_WRITE_U16(command->data, size); // Mailbox service data length
- EC_WRITE_U16(command->data + 2, slave->station_address); // Station address
- EC_WRITE_U8 (command->data + 4, 0x00); // Channel & priority
- EC_WRITE_U8 (command->data + 5, type); // Underlying protocol type
+ EC_WRITE_U16(command->data, size); // mailbox service data length
+ EC_WRITE_U16(command->data + 2, slave->station_address); // station address
+ EC_WRITE_U8 (command->data + 4, 0x00); // hhannel & priority
+ EC_WRITE_U8 (command->data + 5, type); // underlying protocol type
return command->data + 6;
}
@@ -57,14 +58,15 @@
/*****************************************************************************/
/**
- Bereitet ein Kommando zum Abfragen des Mailbox-Zustandes vor.
- */
-
-int ec_slave_mbox_prepare_check(ec_slave_t *slave /**< Slave */)
-{
- ec_command_t *command = &slave->mbox_command;
-
- // FIXME: Zweiter Sync-Manager nicht immer TX-Mailbox?
+ Prepares a command for checking the mailbox state.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_mbox_prepare_check(ec_slave_t *slave /**< slave */)
+{
+ ec_command_t *command = &slave->mbox_command;
+
+ // FIXME: second sync manager?
if (ec_command_nprd(command, slave->station_address, 0x808, 8))
return -1;
@@ -74,10 +76,11 @@
/*****************************************************************************/
/**
- Liest den Mailbox-Zustand aus einem empfangenen Kommando.
- */
-
-int ec_slave_mbox_check(const ec_slave_t *slave /**< Slave */)
+ Processes a mailbox state checking command.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_mbox_check(const ec_slave_t *slave /**< slave */)
{
return EC_READ_U8(slave->mbox_command.data + 5) & 8 ? 1 : 0;
}
@@ -85,10 +88,11 @@
/*****************************************************************************/
/**
- Bereitet ein Kommando zum Laden von Daten von der Mailbox vor.
- */
-
-int ec_slave_mbox_prepare_fetch(ec_slave_t *slave /**< Slave */)
+ Prepares a command to fetch mailbox data.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_mbox_prepare_fetch(ec_slave_t *slave /**< slave */)
{
ec_command_t *command = &slave->mbox_command;
@@ -101,12 +105,13 @@
/*****************************************************************************/
/**
- Verarbeitet empfangene Mailbox-Daten.
- */
-
-uint8_t *ec_slave_mbox_fetch(ec_slave_t *slave, /**< Slave */
- uint8_t type, /**< Protokoll */
- size_t *size /**< Größe der empfangenen Daten */
+ Processes received mailbox data.
+ \return pointer to the received data
+*/
+
+uint8_t *ec_slave_mbox_fetch(ec_slave_t *slave, /**< slave */
+ uint8_t type, /**< expected mailbox protocol */
+ size_t *size /**< size of the received data */
)
{
ec_command_t *command = &slave->mbox_command;
@@ -132,12 +137,12 @@
/*****************************************************************************/
/**
- Sendet und wartet auf den Empfang eines Mailbox-Kommandos.
- */
-
-uint8_t *ec_slave_mbox_simple_io(ec_slave_t *slave, /**< Slave */
- size_t *size /**< Größe der gelesenen
- Daten */
+ Sends a mailbox command and waits for its reception.
+ \return pointer to the received data
+*/
+
+uint8_t *ec_slave_mbox_simple_io(ec_slave_t *slave, /**< slave */
+ size_t *size /**< size of the received data */
)
{
uint8_t type;
@@ -158,13 +163,13 @@
/*****************************************************************************/
/**
- Wartet auf den Empfang eines Mailbox-Kommandos.
- */
-
-uint8_t *ec_slave_mbox_simple_receive(ec_slave_t *slave, /**< Slave */
- uint8_t type, /**< Protokoll */
- size_t *size /**< Größe der gelesenen
- Daten */
+ Waits for the reception of a mailbox command.
+ \return pointer to the received data
+*/
+
+uint8_t *ec_slave_mbox_simple_receive(ec_slave_t *slave, /**< slave */
+ uint8_t type, /**< expected protocol */
+ size_t *size /**< received data size */
)
{
cycles_t start, end, timeout;
@@ -186,7 +191,7 @@
end = get_cycles();
if (ec_slave_mbox_check(slave))
- break; // Proceed with receiving data
+ break; // proceed with receiving data
if ((end - start) >= timeout) {
EC_ERR("Mailbox check - Slave %i timed out.\n",
--- a/master/mailbox.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/mailbox.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* m a i l b o x . h
*
- * Mailbox-Funktionen.
+ * Mailbox functionality.
*
* $Id$
*
@@ -27,9 +27,3 @@
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/master.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/master.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* m a s t e r . c
*
- * Methoden für einen EtherCAT-Master.
+ * EtherCAT master methods.
*
* $Id$
*
@@ -27,6 +27,7 @@
void ec_master_freerun(unsigned long);
ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
+void ec_master_process_watch_command(ec_master_t *);
/*****************************************************************************/
@@ -53,11 +54,12 @@
/*****************************************************************************/
/**
- Konstruktor des EtherCAT-Masters.
-*/
-
-int ec_master_init(ec_master_t *master, /**< EtherCAT-Master */
- unsigned int index /**< Master-Index */
+ Master constructor.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_master_init(ec_master_t *master, /**< EtherCAT master */
+ unsigned int index /**< master index */
)
{
EC_INFO("Initializing master %i.\n", index);
@@ -71,7 +73,7 @@
INIT_LIST_HEAD(&master->domains);
INIT_LIST_HEAD(&master->eoe_slaves);
- // Init kobject and add it to the hierarchy
+ // init kobject and add it to the hierarchy
memset(&master->kobj, 0x00, sizeof(struct kobject));
kobject_init(&master->kobj);
master->kobj.ktype = &ktype_ec_master;
@@ -81,7 +83,7 @@
return -1;
}
- // Init freerun timer
+ // init freerun timer
init_timer(&master->freerun_timer);
master->freerun_timer.function = ec_master_freerun;
master->freerun_timer.data = (unsigned long) master;
@@ -96,13 +98,12 @@
/*****************************************************************************/
/**
- Destruktor eines EtherCAT-Masters.
-
- Entfernt alle Kommandos aus der Liste, löscht den Zeiger
- auf das Slave-Array und gibt die Prozessdaten frei.
-*/
-
-void ec_master_clear(struct kobject *kobj /**< KObject des Masters */)
+ Master destructor.
+ Removes all pending commands, clears the slave list, clears all domains
+ and frees the device.
+*/
+
+void ec_master_clear(struct kobject *kobj /**< kobject of the master */)
{
ec_master_t *master = container_of(kobj, ec_master_t, kobj);
@@ -126,15 +127,12 @@
/*****************************************************************************/
/**
- Setzt den Master zurück in den Ausgangszustand.
-
- Bei einem "release" sollte immer diese Funktion aufgerufen werden,
- da sonst Slave-Liste, Domains, etc. weiter existieren.
-*/
-
-void ec_master_reset(ec_master_t *master
- /**< Zeiger auf den zurückzusetzenden Master */
- )
+ Resets the master.
+ Note: This function has to be called, everytime ec_master_release() is
+ called, to free the slave list, domains etc.
+*/
+
+void ec_master_reset(ec_master_t *master /**< EtherCAT master */)
{
ec_slave_t *slave, *next_s;
ec_command_t *command, *next_c;
@@ -143,7 +141,7 @@
ec_master_freerun_stop(master);
- // Alle Slaves entfernen
+ // remove all slaves
list_for_each_entry_safe(slave, next_s, &master->slaves, list) {
list_del(&slave->list);
kobject_del(&slave->kobj);
@@ -151,20 +149,20 @@
}
master->slave_count = 0;
- // Kommando-Warteschlange leeren
+ // empty command queue
list_for_each_entry_safe(command, next_c, &master->command_queue, queue) {
list_del_init(&command->queue);
command->state = EC_CMD_ERROR;
}
- // Domain-Liste leeren
+ // clear domains
list_for_each_entry_safe(domain, next_d, &master->domains, list) {
list_del(&domain->list);
kobject_del(&domain->kobj);
kobject_put(&domain->kobj);
}
- // EOE-Liste leeren
+ // clear EoE objects
list_for_each_entry_safe(eoe, next_eoe, &master->eoe_slaves, list) {
list_del(&eoe->list);
ec_eoe_clear(eoe);
@@ -191,16 +189,16 @@
/*****************************************************************************/
/**
- Stellt ein Kommando in die Warteschlange.
-*/
-
-void ec_master_queue_command(ec_master_t *master, /**< EtherCAT-Master */
- ec_command_t *command /**< Kommando */
+ Places a command in the command queue.
+*/
+
+void ec_master_queue_command(ec_master_t *master, /**< EtherCAT master */
+ ec_command_t *command /**< command */
)
{
ec_command_t *queued_command;
- // Ist das Kommando schon in der Warteschlange?
+ // check, if the command is already queued
list_for_each_entry(queued_command, &master->command_queue, queue) {
if (queued_command == command) {
command->state = EC_CMD_QUEUED;
@@ -217,12 +215,11 @@
/*****************************************************************************/
/**
- Sendet die Kommandos in der Warteschlange.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-void ec_master_send_commands(ec_master_t *master /**< EtherCAT-Master */)
+ Sends the commands in the queue.
+ \return 0 in case of success, else < 0
+*/
+
+void ec_master_send_commands(ec_master_t *master /**< EtherCAT master */)
{
ec_command_t *command;
size_t command_size;
@@ -239,17 +236,17 @@
}
do {
- // Zeiger auf Socket-Buffer holen
+ // fetch pointer to transmit socket buffer
frame_data = ec_device_tx_data(master->device);
cur_data = frame_data + EC_FRAME_HEADER_SIZE;
follows_word = NULL;
more_commands_waiting = 0;
- // Aktuellen Frame mit Kommandos füllen
+ // fill current frame with commands
list_for_each_entry(command, &master->command_queue, queue) {
if (command->state != EC_CMD_QUEUED) continue;
- // Passt das aktuelle Kommando noch in den aktuellen Rahmen?
+ // does the current command fit in the frame?
command_size = EC_COMMAND_HEADER_SIZE + command->data_size
+ EC_COMMAND_FOOTER_SIZE;
if (cur_data - frame_data + command_size > EC_MAX_FRAME_SIZE) {
@@ -263,7 +260,7 @@
if (unlikely(master->debug_level > 0))
EC_DBG("adding command 0x%02X\n", command->index);
- // Command-Following-Flag im letzten Kommando setzen
+ // set "command following" flag in previous frame
if (follows_word)
EC_WRITE_U16(follows_word, EC_READ_U16(follows_word) | 0x8000);
@@ -281,7 +278,7 @@
cur_data += command->data_size;
// EtherCAT command footer
- EC_WRITE_U16(cur_data, 0x0000); // Working counter
+ EC_WRITE_U16(cur_data, 0x0000); // reset working counter
cur_data += EC_COMMAND_FOOTER_SIZE;
}
@@ -295,14 +292,14 @@
EC_WRITE_U16(frame_data, ((cur_data - frame_data
- EC_FRAME_HEADER_SIZE) & 0x7FF) | 0x1000);
- // Rahmen auffüllen
+ // pad frame
while (cur_data - frame_data < EC_MIN_FRAME_SIZE)
EC_WRITE_U8(cur_data++, 0x00);
if (unlikely(master->debug_level > 0))
EC_DBG("frame size: %i\n", cur_data - frame_data);
- // Send frame
+ // send frame
ec_device_send(master->device, cur_data - frame_data);
frame_count++;
}
@@ -319,16 +316,14 @@
/**
Processes a received frame.
-
This function is called by the network driver for every received frame.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-void ec_master_receive(ec_master_t *master, /**< EtherCAT-Master */
- const uint8_t *frame_data, /**< Empfangene Daten */
- size_t size /**< Anzahl empfangene Datenbytes */
- )
+ \return 0 in case of success, else < 0
+*/
+
+void ec_master_receive(ec_master_t *master, /**< EtherCAT master */
+ const uint8_t *frame_data, /**< received data */
+ size_t size /**< size of the received data */
+ )
{
size_t frame_size, data_size;
uint8_t command_type, command_index;
@@ -344,7 +339,7 @@
cur_data = frame_data;
- // Länge des gesamten Frames prüfen
+ // check length of entire frame
frame_size = EC_READ_U16(cur_data) & 0x07FF;
cur_data += EC_FRAME_HEADER_SIZE;
@@ -356,7 +351,7 @@
cmd_follows = 1;
while (cmd_follows) {
- // Kommando-Header auswerten
+ // process command header
command_type = EC_READ_U8 (cur_data);
command_index = EC_READ_U8 (cur_data + 1);
data_size = EC_READ_U16(cur_data + 6) & 0x07FF;
@@ -370,7 +365,7 @@
return;
}
- // Suche passendes Kommando in der Liste
+ // search for matching command in the queue
matched = 0;
list_for_each_entry(command, &master->command_queue, queue) {
if (command->state == EC_CMD_SENT
@@ -382,7 +377,7 @@
}
}
- // Kein passendes Kommando in der Liste gefunden
+ // no matching command was found
if (!matched) {
master->stats.unmatched++;
ec_master_output_stats(master);
@@ -390,15 +385,15 @@
continue;
}
- // Empfangene Daten in Kommando-Datenspeicher kopieren
+ // copy received data in the command memory
memcpy(command->data, cur_data, data_size);
cur_data += data_size;
- // Working-Counter setzen
+ // set the command's working counter
command->working_counter = EC_READ_U16(cur_data);
cur_data += EC_COMMAND_FOOTER_SIZE;
- // Kommando aus der Warteschlange entfernen
+ // dequeue the received command
command->state = EC_CMD_RECEIVED;
list_del_init(&command->queue);
}
@@ -407,16 +402,13 @@
/*****************************************************************************/
/**
- Sendet ein einzelnes Kommando und wartet auf den Empfang.
-
- Wenn der Slave nicht antwortet, wird das Kommando
- nochmals gesendet.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_master_simple_io(ec_master_t *master, /**< EtherCAT-Master */
- ec_command_t *command /**< Kommando */
+ Sends a single command and waits for its reception.
+ If the slave doesn't respond, the command is sent again.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_master_simple_io(ec_master_t *master, /**< EtherCAT master */
+ ec_command_t *command /**< command */
)
{
unsigned int response_tries_left;
@@ -441,7 +433,7 @@
return -1;
}
- // Keine direkte Antwort. Dem Slave Zeit lassen...
+ // no direct response, wait a little bit...
udelay(100);
if (unlikely(--response_tries_left)) {
@@ -454,15 +446,12 @@
/*****************************************************************************/
/**
- Durchsucht den EtherCAT-Bus nach Slaves.
-
- Erstellt ein Array mit allen Slave-Informationen die für den
- weiteren Betrieb notwendig sind.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_master_bus_scan(ec_master_t *master /**< EtherCAT-Master */)
+ Scans the EtherCAT bus for slaves.
+ Creates a list of slave structures for further processing.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_master_bus_scan(ec_master_t *master /**< EtherCAT master */)
{
ec_slave_t *slave, *next;
ec_slave_ident_t *ident;
@@ -479,7 +468,7 @@
command = &master->simple_command;
- // Determine number of slaves on bus
+ // determine number of slaves on bus
if (ec_command_brd(command, 0x0000, 4)) return -1;
if (unlikely(ec_master_simple_io(master, command))) return -1;
master->slave_count = command->working_counter;
@@ -487,7 +476,7 @@
if (!master->slave_count) return 0;
- // Init slaves
+ // init slaves
for (i = 0; i < master->slave_count; i++) {
if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t), GFP_KERNEL))) {
EC_ERR("Failed to allocate slave %i!\n", i);
@@ -510,10 +499,10 @@
current_coupler_index = 0x3FFF;
coupler_subindex = 0;
- // For every slave on the bus
+ // for every slave on the bus
list_for_each_entry(slave, &master->slaves, list) {
- // Write station address
+ // write station address
if (ec_command_apwr(command, slave->ring_position, 0x0010,
sizeof(uint16_t))) goto out_free;
EC_WRITE_U16(command->data, slave->station_address);
@@ -523,10 +512,10 @@
goto out_free;
}
- // Fetch all slave information
+ // fetch all slave information
if (ec_slave_fetch(slave)) goto out_free;
- // Search for identification in "database"
+ // search for identification in "database"
ident = slave_idents;
while (ident->type) {
if (unlikely(ident->vendor_id == slave->sii_vendor_id
@@ -554,7 +543,7 @@
slave->coupler_subindex = coupler_subindex;
coupler_subindex++;
- // Does the slave support EoE?
+ // does the slave support EoE?
if (slave->sii_mailbox_protocols & EC_MBOX_EOE) {
if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
EC_ERR("Failed to allocate EoE-Object.\n");
@@ -580,15 +569,12 @@
/*****************************************************************************/
/**
- Statistik-Ausgaben während des zyklischen Betriebs.
-
- Diese Funktion sorgt dafür, dass Statistiken während des zyklischen
- Betriebs bei Bedarf, aber nicht zu oft ausgegeben werden.
-
- Die Ausgabe erfolgt gesammelt höchstens einmal pro Sekunde.
-*/
-
-void ec_master_output_stats(ec_master_t *master /**< EtherCAT-Master */)
+ Output statistics in cyclic mode.
+ This function outputs statistical data on demand, but not more often than
+ necessary. The output happens at most once a second.
+*/
+
+void ec_master_output_stats(ec_master_t *master /**< EtherCAT master */)
{
cycles_t t_now = get_cycles();
@@ -620,7 +606,7 @@
/*****************************************************************************/
/**
- Starts Free-Run mode.
+ Starts the Free-Run mode.
*/
void ec_master_freerun_start(ec_master_t *master /**< EtherCAT master */)
@@ -636,6 +622,15 @@
master->mode = EC_MASTER_MODE_FREERUN;
+ if (master->watch_command.state == EC_CMD_INIT) {
+ if (ec_command_brd(&master->watch_command, 0x130, 2)) {
+ EC_ERR("Failed to allocate watchdog command!\n");
+ return;
+ }
+ }
+
+ ecrt_master_prepare_async_io(master);
+
master->freerun_timer.expires = jiffies + 10;
add_timer(&master->freerun_timer);
}
@@ -643,7 +638,7 @@
/*****************************************************************************/
/**
- Stops Free-Run mode.
+ Stops the Free-Run mode.
*/
void ec_master_freerun_stop(ec_master_t *master /**< EtherCAT master */)
@@ -662,11 +657,19 @@
Free-Run mode function.
*/
-void ec_master_freerun(unsigned long data)
+void ec_master_freerun(unsigned long data /**< private timer data = master */)
{
ec_master_t *master = (ec_master_t *) data;
- // nop
+ ecrt_master_async_receive(master);
+
+ // watchdog command
+ ec_master_process_watch_command(master);
+ ec_master_queue_command(master, &master->watch_command);
+
+ master->slave_count = master->watch_command.working_counter;
+
+ ecrt_master_async_send(master);
master->freerun_timer.expires += HZ;
add_timer(&master->freerun_timer);
@@ -675,22 +678,19 @@
/*****************************************************************************/
/**
- Wandelt eine ASCII-kodierte Bus-Adresse in einen Slave-Zeiger.
-
- Gültige Adress-Strings sind Folgende:
- - \a "X" = der X. Slave im Bus,
- - \a "X:Y" = der Y. Slave hinter dem X. Buskoppler,
- - \a "#X" = der Slave mit dem Alias X,
- - \a "#X:Y" = der Y. Slave hinter dem Buskoppler mit dem Alias X.
-
- X und Y fangen immer bei 0 an und können auch hexadezimal oder oktal
- angegeben werden (mit entsprechendem Prefix).
-
- \return Zeiger auf Slave bei Erfolg, sonst NULL
+ Translates an ASCII coded bus-address to a slave pointer.
+ These are the valid addressing schemes:
+ - \a "X" = the X. slave on the bus,
+ - \a "X:Y" = the Y. slave after the X. branch (bus coupler),
+ - \a "#X" = the slave with alias X,
+ - \a "#X:Y" = the Y. slave after the branch (bus coupler) with alias X.
+ X and Y are zero-based indices and may be provided in hexadecimal or octal
+ notation (with respective prefix).
+ \return pointer to the slave on success, else NULL
*/
ec_slave_t *ecrt_master_get_slave(const ec_master_t *master, /**< Master */
- const char *address /**< Address-String */
+ const char *address /**< address string */
)
{
unsigned long first, second;
@@ -785,14 +785,12 @@
/*****************************************************************************/
/**
- Initialisiert eine Sync-Manager-Konfigurationsseite.
-
- Der mit \a data referenzierte Speicher muss mindestens EC_SYNC_SIZE Bytes
- groß sein.
-*/
-
-void ec_sync_config(const ec_sync_t *sync, /**< Sync-Manager */
- uint8_t *data /**> Zeiger auf Konfigurationsspeicher */
+ Initializes a sync manager configuration page.
+ The referenced memory (\a data) must be at least EC_SYNC_SIZE bytes.
+*/
+
+void ec_sync_config(const ec_sync_t *sync, /**< sync manager */
+ uint8_t *data /**> configuration memory */
)
{
EC_WRITE_U16(data, sync->physical_start_address);
@@ -805,14 +803,12 @@
/*****************************************************************************/
/**
- Initialisiert eine Sync-Manager-Konfigurationsseite mit EEPROM-Daten.
-
- Der mit \a data referenzierte Speicher muss mindestens EC_SYNC_SIZE Bytes
- groß sein.
-*/
-
-void ec_eeprom_sync_config(const ec_eeprom_sync_t *sync, /**< Sync-Manager */
- uint8_t *data /**> Zeiger auf Konfig.-Speicher */
+ Initializes a sync manager configuration page with EEPROM data.
+ The referenced memory (\a data) must be at least EC_SYNC_SIZE bytes.
+*/
+
+void ec_eeprom_sync_config(const ec_eeprom_sync_t *sync, /**< sync manager */
+ uint8_t *data /**> configuration memory */
)
{
EC_WRITE_U16(data, sync->physical_start_address);
@@ -825,38 +821,35 @@
/*****************************************************************************/
/**
- Initialisiert eine FMMU-Konfigurationsseite.
-
- Der mit \a data referenzierte Speicher muss mindestens EC_FMMU_SIZE Bytes
- groß sein.
-*/
-
-void ec_fmmu_config(const ec_fmmu_t *fmmu, /**< Sync-Manager */
- uint8_t *data /**> Zeiger auf Konfigurationsspeicher */
+ Initializes an FMMU configuration page.
+ The referenced memory (\a data) must be at least EC_FMMU_SIZE bytes.
+*/
+
+void ec_fmmu_config(const ec_fmmu_t *fmmu, /**< FMMU */
+ uint8_t *data /**> configuration memory */
)
{
EC_WRITE_U32(data, fmmu->logical_start_address);
EC_WRITE_U16(data + 4, fmmu->sync->size);
- EC_WRITE_U8 (data + 6, 0x00); // Logical start bit
- EC_WRITE_U8 (data + 7, 0x07); // Logical end bit
+ EC_WRITE_U8 (data + 6, 0x00); // logical start bit
+ EC_WRITE_U8 (data + 7, 0x07); // logical end bit
EC_WRITE_U16(data + 8, fmmu->sync->physical_start_address);
- EC_WRITE_U8 (data + 10, 0x00); // Physical start bit
+ EC_WRITE_U8 (data + 10, 0x00); // physical start bit
EC_WRITE_U8 (data + 11, (fmmu->sync->control_byte & 0x04) ? 0x02 : 0x01);
- EC_WRITE_U16(data + 12, 0x0001); // Enable
- EC_WRITE_U16(data + 14, 0x0000); // res.
-}
-
-/*****************************************************************************/
-
-/**
- Formatiert Attribut-Daten für lesenden Zugriff im SysFS
-
- \return Anzahl Bytes im Speicher
-*/
-
-ssize_t ec_show_master_attribute(struct kobject *kobj, /**< KObject */
- struct attribute *attr, /**< Attribut */
- char *buffer /**< Speicher für die Daten */
+ EC_WRITE_U16(data + 12, 0x0001); // enable
+ EC_WRITE_U16(data + 14, 0x0000); // reserved
+}
+
+/*****************************************************************************/
+
+/**
+ Formats attribute data for SysFS read access.
+ \return number of bytes to read
+*/
+
+ssize_t ec_show_master_attribute(struct kobject *kobj, /**< kobject */
+ struct attribute *attr, /**< attribute */
+ char *buffer /**< memory to store data */
)
{
ec_master_t *master = container_of(kobj, ec_master_t, kobj);
@@ -881,11 +874,11 @@
/*****************************************************************************/
/**
- Gibt Überwachungsinformationen aus.
+ Processes the watchdog command.
*/
void ec_master_process_watch_command(ec_master_t *master
- /**< EtherCAT-Master */
+ /**< EtherCAT master */
)
{
unsigned int first;
@@ -926,18 +919,15 @@
}
/******************************************************************************
- *
- * Echtzeitschnittstelle
- *
+ * Realtime interface
*****************************************************************************/
/**
- Erstellt eine neue Domäne.
-
- \return Zeiger auf die Domäne bei Erfolg, sonst NULL.
-*/
-
-ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< Master */)
+ Creates a domain.
+ \return pointer to new domain on success, else NULL
+*/
+
+ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< master */)
{
ec_domain_t *domain, *last_domain;
unsigned int index;
@@ -975,16 +965,14 @@
/*****************************************************************************/
/**
- Konfiguriert alle Slaves und setzt den Operational-Zustand.
-
- Führt die komplette Konfiguration und Aktivierunge aller registrierten
- 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
-*/
-
-int ecrt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
+ Configures all slaves and leads them to the OP state.
+ Does the complete configuration and activation for all slaves. Sets sync
+ managers and FMMUs, and does the appropriate transitions, until the slave
+ is operational.
+ \return 0 in case of success, else < 0
+*/
+
+int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
{
unsigned int j;
ec_slave_t *slave;
@@ -998,12 +986,14 @@
command = &master->simple_command;
- if (ec_command_brd(&master->watch_command, 0x130, 2)) {
- EC_ERR("Failed to allocate watchdog command!\n");
- return -1;
- }
-
- // Domains erstellen
+ if (master->watch_command.state == EC_CMD_INIT) {
+ if (ec_command_brd(&master->watch_command, 0x130, 2)) {
+ EC_ERR("Failed to allocate watchdog command!\n");
+ return -1;
+ }
+ }
+
+ // allocate all domains
domain_offset = 0;
list_for_each_entry(domain, &master->domains, list) {
if (ec_domain_alloc(domain, domain_offset)) {
@@ -1013,22 +1003,22 @@
domain_offset += domain->data_size;
}
- // Slaves aktivieren
+ // configure and activate slaves
list_for_each_entry(slave, &master->slaves, list) {
- // Change state to INIT
+ // change state to INIT
if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_INIT)))
return -1;
- // Check if slave was registered...
+ // check for slave registration
type = slave->type;
if (!type)
EC_WARN("Slave %i has unknown type!\n", slave->ring_position);
- // Check and reset CRC fault counters
+ // check and reset CRC fault counters
ec_slave_check_crc(slave);
- // Resetting FMMUs
+ // reset FMMUs
if (slave->base_fmmu_count) {
if (ec_command_npwr(command, slave->station_address, 0x0600,
EC_FMMU_SIZE * slave->base_fmmu_count))
@@ -1041,7 +1031,7 @@
}
}
- // Resetting Sync Manager channels
+ // reset sync managers
if (slave->base_sync_count) {
if (ec_command_npwr(command, slave->station_address, 0x0800,
EC_SYNC_SIZE * slave->base_sync_count))
@@ -1054,10 +1044,8 @@
}
}
- // Set Sync Managers
-
- // Known slave type, take type's SM information
- if (type) {
+ // configure sync managers
+ if (type) { // known slave type, take type's SM information
for (j = 0; type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
sync = type->sync_managers[j];
if (ec_command_npwr(command, slave->station_address,
@@ -1071,11 +1059,8 @@
}
}
}
-
- // Unknown slave type, but has mailbox
- else if (slave->sii_mailbox_protocols) {
-
- // Does the device supply SM configurations in its EEPROM?
+ else if (slave->sii_mailbox_protocols) { // unknown type, but mailbox
+ // does the device supply SM configurations in its EEPROM?
if (!list_empty(&slave->eeprom_syncs)) {
list_for_each_entry(eeprom_sync, &slave->eeprom_syncs, list) {
EC_INFO("Sync manager %i...\n", eeprom_sync->index);
@@ -1091,9 +1076,7 @@
}
}
}
-
- // No sync manager information; guess mailbox settings
- else {
+ else { // no sync manager information; guess mailbox settings
mbox_sync.physical_start_address =
slave->sii_rx_mailbox_offset;
mbox_sync.length = slave->sii_rx_mailbox_size;
@@ -1126,21 +1109,21 @@
slave->ring_position);
}
- // Change state to PREOP
+ // change state to PREOP
if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_PREOP)))
return -1;
- // Stop activation here for slaves without type
+ // stop activation here for slaves without type
if (!type) continue;
- // Slaves that are not registered are only brought into PREOP
+ // slaves that are not registered are only brought into PREOP
// state -> nice blinking and mailbox communication possible
if (!slave->registered && !slave->type->special) {
EC_WARN("Slave %i was not registered!\n", slave->ring_position);
continue;
}
- // Set FMMUs
+ // configure FMMUs
for (j = 0; j < slave->fmmu_count; j++) {
fmmu = &slave->fmmus[j];
if (ec_command_npwr(command, slave->station_address,
@@ -1154,11 +1137,11 @@
}
}
- // Change state to SAVEOP
+ // change state to SAVEOP
if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_SAVEOP)))
return -1;
- // Change state to OP
+ // change state to OP
if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_OP)))
return -1;
}
@@ -1172,10 +1155,10 @@
/*****************************************************************************/
/**
- Setzt alle Slaves zurück in den Init-Zustand.
-*/
-
-void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT-Master */)
+ Resets all slaves to INIT state.
+*/
+
+void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */)
{
ec_slave_t *slave;
@@ -1189,14 +1172,12 @@
/*****************************************************************************/
/**
- Lädt die SDO-Dictionaries aller Slaves.
-
- Slaves, die kein CoE unterstützen, werden ausgelassen.
-
- \return 0 wenn alles ok, sonst < 0
-*/
-
-int ecrt_master_fetch_sdo_lists(ec_master_t *master /**< EtherCAT-Master */)
+ Fetches the SDO dictionaries of all slaves.
+ Slaves that do not support the CoE protocol are left out.
+ \return 0 in case of success, else < 0
+*/
+
+int ecrt_master_fetch_sdo_lists(ec_master_t *master /**< EtherCAT master */)
{
ec_slave_t *slave;
@@ -1216,27 +1197,26 @@
/*****************************************************************************/
/**
- Sendet und empfängt Kommandos synchron.
-*/
-
-void ecrt_master_sync_io(ec_master_t *master)
+ Sends queued commands and waits for their reception.
+*/
+
+void ecrt_master_sync_io(ec_master_t *master /**< EtherCAT master */)
{
ec_command_t *command, *n;
unsigned int commands_sent;
cycles_t t_start, t_end, t_timeout;
- // Kommandos senden
+ // send commands
ecrt_master_async_send(master);
- t_start = get_cycles(); // Sendezeit nehmen
+ t_start = get_cycles(); // measure io time
t_timeout = (cycles_t) master->timeout * (cpu_khz / 1000);
- while (1) // Aktiv auf Empfang warten
- {
+ while (1) { // active waiting
ec_device_call_isr(master->device);
- t_end = get_cycles(); // Aktuelle Zeit nehmen
- if (t_end - t_start >= t_timeout) break; // Timeout
+ t_end = get_cycles(); // take current time
+ if (t_end - t_start >= t_timeout) break; // timeout!
commands_sent = 0;
list_for_each_entry_safe(command, n, &master->command_queue, queue) {
@@ -1249,7 +1229,7 @@
if (!commands_sent) break;
}
- // Zeit abgelaufen. Alle verbleibenden Kommandos entfernen.
+ // timeout; dequeue all commands
list_for_each_entry_safe(command, n, &master->command_queue, queue) {
switch (command->state) {
case EC_CMD_SENT:
@@ -1272,46 +1252,46 @@
/*****************************************************************************/
/**
- Sendet Kommandos asynchron.
-*/
-
-void ecrt_master_async_send(ec_master_t *master)
+ Asynchronous sending of commands.
+*/
+
+void ecrt_master_async_send(ec_master_t *master /**< EtherCAT master */)
{
ec_command_t *command, *n;
if (unlikely(!master->device->link_state)) {
- // Link DOWN, keines der Kommandos kann gesendet werden.
+ // link is down, no command can be sent
list_for_each_entry_safe(command, n, &master->command_queue, queue) {
command->state = EC_CMD_ERROR;
list_del_init(&command->queue);
}
- // Device-Zustand abfragen
+ // query link state
ec_device_call_isr(master->device);
return;
}
- // Rahmen senden
+ // send frames
ec_master_send_commands(master);
}
/*****************************************************************************/
/**
- Empfängt Kommandos asynchron.
-*/
-
-void ecrt_master_async_receive(ec_master_t *master)
+ Asynchronous receiving of commands.
+*/
+
+void ecrt_master_async_receive(ec_master_t *master /**< EtherCAT master */)
{
ec_command_t *command, *next;
ec_device_call_isr(master->device);
- // Alle empfangenen Kommandos aus der Liste entfernen
+ // dequeue all received commands
list_for_each_entry_safe(command, next, &master->command_queue, queue)
if (command->state == EC_CMD_RECEIVED) list_del_init(&command->queue);
- // Alle verbleibenden Kommandos entfernen.
+ // dequeue all remaining commands
list_for_each_entry_safe(command, next, &master->command_queue, queue) {
switch (command->state) {
case EC_CMD_SENT:
@@ -1330,28 +1310,26 @@
/*****************************************************************************/
/**
- Bereitet Synchronen Datenverkehr vor.
-
- Fürgt einmal die Kommandos aller Domains zur Warteschlange hinzu, sendet
- diese ab und wartet so lange, bis diese anschließend problemlos empfangen
- werden können.
-*/
-
-void ecrt_master_prepare_async_io(ec_master_t *master)
+ Prepares synchronous IO.
+ Queues all domain commands and sends them. Then waits a certain time, so
+ that ecrt_master_sasync_receive() can be called securely.
+*/
+
+void ecrt_master_prepare_async_io(ec_master_t *master /**< EtherCAT master */)
{
ec_domain_t *domain;
cycles_t t_start, t_end, t_timeout;
- // Kommandos aller Domains in die Warteschlange setzen
+ // queue commands of all domains
list_for_each_entry(domain, &master->domains, list)
ecrt_domain_queue(domain);
ecrt_master_async_send(master);
- t_start = get_cycles(); // Sendezeit nehmen
+ t_start = get_cycles(); // take sending time
t_timeout = (cycles_t) master->timeout * (cpu_khz / 1000);
- // Aktiv warten!
+ // active waiting
while (1) {
t_end = get_cycles();
if (t_end - t_start >= t_timeout) break;
@@ -1361,15 +1339,15 @@
/*****************************************************************************/
/**
- Führt Routinen im zyklischen Betrieb aus.
-*/
-
-void ecrt_master_run(ec_master_t *master /**< EtherCAT-Master */)
-{
- // Statistiken ausgeben
+ Does all cyclic master work.
+*/
+
+void ecrt_master_run(ec_master_t *master /**< EtherCAT master */)
+{
+ // output statistics
ec_master_output_stats(master);
- // Watchdog-Kommando
+ // watchdog command
ec_master_process_watch_command(master);
ec_master_queue_command(master, &master->watch_command);
@@ -1380,16 +1358,14 @@
/*****************************************************************************/
/**
- Setzt die Debug-Ebene des Masters.
-
- Folgende Debug-Level sind definiert:
-
- - 1: Nur Positionsmarken in bestimmten Funktionen
- - 2: Komplette Frame-Inhalte
-*/
-
-void ecrt_master_debug(ec_master_t *master, /**< EtherCAT-Master */
- int level /**< Debug-Level */
+ Sets the debug level of the master.
+ The following levels are valid:
+ - 1: only output positions marks and basic data
+ - 2: additional frame data output
+*/
+
+void ecrt_master_debug(ec_master_t *master, /**< EtherCAT master */
+ int level /**< debug level */
)
{
if (level != master->debug_level) {
@@ -1401,16 +1377,15 @@
/*****************************************************************************/
/**
- Gibt alle Informationen zum Master aus.
-
+ Outputs all master information.
Verbosity:
- 0 - Nur Slavetypen und Adressen
- 1 - mit EEPROM-Informationen
- >1 - mit SDO-Dictionaries
-*/
-
-void ecrt_master_print(const ec_master_t *master, /**< EtherCAT-Master */
- unsigned int verbosity /**< Geschwätzigkeit */
+ - 0: Only slave types and positions
+ - 1: with EEPROM contents
+ - >1: with SDO dictionaries
+*/
+
+void ecrt_master_print(const ec_master_t *master, /**< EtherCAT master */
+ unsigned int verbosity /**< verbosity level */
)
{
ec_slave_t *slave;
@@ -1433,7 +1408,11 @@
/*****************************************************************************/
-void ec_master_run_eoe(ec_master_t *master /**< EtherCAT-Master */)
+/**
+ Does the Ethernet-over-EtherCAT processing.
+*/
+
+void ec_master_run_eoe(ec_master_t *master /**< EtherCAT master */)
{
ec_eoe_t *eoe;
@@ -1458,9 +1437,3 @@
EXPORT_SYMBOL(ecrt_master_get_slave);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/master.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/master.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* m a s t e r . h
*
- * Struktur für einen EtherCAT-Master.
+ * EtherCAT master structure.
*
* $Id$
*
@@ -35,61 +35,59 @@
/*****************************************************************************/
/**
- EtherCAT-Rahmen-Statistiken.
+ Cyclic EtherCAT statistics.
*/
typedef struct
{
- unsigned int timeouts; /**< Kommando-Timeouts */
- unsigned int delayed; /**< Verzögerte Kommandos */
- unsigned int corrupted; /**< Verfälschte Rahmen */
- unsigned int unmatched; /**< Unpassende Kommandos */
- unsigned int eoe_errors; /**< Ethernet-over-EtherCAT Fehler */
- cycles_t t_last; /**< Timestamp-Counter bei der letzten Ausgabe */
+ unsigned int timeouts; /**< command timeouts */
+ unsigned int delayed; /**< delayed commands */
+ unsigned int corrupted; /**< corrupted frames */
+ unsigned int unmatched; /**< unmatched commands */
+ unsigned int eoe_errors; /**< Ethernet-over-EtherCAT errors */
+ cycles_t t_last; /**< time of last output */
}
ec_stats_t;
/*****************************************************************************/
/**
- EtherCAT-Master
-
- Verwaltet die EtherCAT-Slaves und kommuniziert mit
- dem zugewiesenen EtherCAT-Gerät.
+ EtherCAT-Master.
+ Manages slaves, domains and IO.
*/
struct ec_master
{
- struct list_head list; /**< Noetig fuer Master-Liste */
- struct kobject kobj; /**< Kernel-Object */
- unsigned int index; /**< Master-Index */
- struct list_head slaves; /**< Liste der Slaves auf dem Bus */
- unsigned int slave_count; /**< Anzahl Slaves auf dem Bus */
- ec_device_t *device; /**< EtherCAT-Gerät */
- struct list_head command_queue; /**< Kommando-Warteschlange */
- uint8_t command_index; /**< Aktueller Kommando-Index */
- struct list_head domains; /**< Liste der Prozessdatendomänen */
- ec_command_t simple_command; /**< Kommando für Initialisierungsphase */
- ec_command_t watch_command; /**< Kommando zum Überwachen der Slaves */
- unsigned int slaves_responding; /**< Anzahl antwortender Slaves */
- ec_slave_state_t slave_states; /**< Zustände der antwortenden Slaves */
- int debug_level; /**< Debug-Level im Master-Code */
- ec_stats_t stats; /**< Rahmen-Statistiken */
- unsigned int timeout; /**< Timeout für synchronen Datenaustausch */
- struct list_head eoe_slaves; /**< Ethernet over EtherCAT Slaves */
- unsigned int reserved; /**< Master durch Echtzeitprozess reserviert */
- struct timer_list freerun_timer; /**< Timer fuer Free-Run-Modus. */
- ec_master_mode_t mode; /**< Modus des Masters */
+ struct list_head list; /**< list item */
+ struct kobject kobj; /**< kobject */
+ unsigned int index; /**< master index */
+ struct list_head slaves; /**< list of slaves on the bus */
+ unsigned int slave_count; /**< number of slaves on the bus */
+ ec_device_t *device; /**< EtherCAT device */
+ struct list_head command_queue; /**< command queue */
+ uint8_t command_index; /**< current command index */
+ struct list_head domains; /**< list of domains */
+ ec_command_t simple_command; /**< command structure for initialization */
+ ec_command_t watch_command; /**< command for watching the slaves */
+ unsigned int slaves_responding; /**< number of responding slaves */
+ ec_slave_state_t slave_states; /**< states of the responding slaves */
+ int debug_level; /**< master debug level */
+ ec_stats_t stats; /**< cyclic statistics */
+ unsigned int timeout; /**< timeout in synchronous IO */
+ struct list_head eoe_slaves; /**< Ethernet-over-EtherCAT slaves */
+ unsigned int reserved; /**< true, if the master is reserved for RT */
+ struct timer_list freerun_timer; /**< timer object for free run mode */
+ ec_master_mode_t mode; /**< master mode */
};
/*****************************************************************************/
-// Master creation and deletion
+// master creation and deletion
int ec_master_init(ec_master_t *, unsigned int);
void ec_master_clear(struct kobject *);
void ec_master_reset(ec_master_t *);
-// Free-Run
+// free run
void ec_master_freerun_start(ec_master_t *);
void ec_master_freerun_stop(ec_master_t *);
@@ -98,10 +96,10 @@
void ec_master_queue_command(ec_master_t *, ec_command_t *);
int ec_master_simple_io(ec_master_t *, ec_command_t *);
-// Slave management
+// slave management
int ec_master_bus_scan(ec_master_t *);
-// Misc
+// misc.
void ec_master_debug(const ec_master_t *);
void ec_master_output_stats(ec_master_t *);
void ec_master_run_eoe(ec_master_t *);
@@ -109,9 +107,3 @@
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/module.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/module.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,9 +2,9 @@
*
* m o d u l e . c
*
- * EtherCAT-Master-Treiber
- *
- * Autoren: Wilhelm Hagemeister, Florian Pose
+ * EtherCAT master driver module.
+ *
+ * Author: Florian Pose <fp@igh-essen.com>
*
* $Id$
*
@@ -50,18 +50,14 @@
MODULE_VERSION(COMPILE_INFO);
module_param(ec_master_count, int, 1);
-MODULE_PARM_DESC(ec_master_count, "Number of EtherCAT master to initialize.");
-
-/*****************************************************************************/
-
-/**
- Init-Funktion des EtherCAT-Master-Treibermodules
-
- Initialisiert soviele Master, wie im Parameter ec_master_count
- angegeben wurde (Default ist 1).
-
- \return 0 wenn alles ok, < 0 bei ungültiger Anzahl Master
- oder zu wenig Speicher.
+MODULE_PARM_DESC(ec_master_count, "number of EtherCAT masters to initialize");
+
+/*****************************************************************************/
+
+/**
+ Module initialization.
+ Initializes \a ec_master_count masters.
+ \return 0 on success, else < 0
*/
int __init ec_init_module(void)
@@ -115,9 +111,8 @@
/*****************************************************************************/
/**
- Cleanup-Funktion des EtherCAT-Master-Treibermoduls
-
- Entfernt alle Master-Instanzen.
+ Module cleanup.
+ Clears all master instances.
*/
void __exit ec_cleanup_module(void)
@@ -142,7 +137,7 @@
\returns pointer to master
*/
-ec_master_t *ec_find_master(unsigned int master_index)
+ec_master_t *ec_find_master(unsigned int master_index /**< master index */)
{
ec_master_t *master;
@@ -155,26 +150,19 @@
}
/******************************************************************************
- *
- * Treiberschnittstelle
- *
+ * Device interface
*****************************************************************************/
/**
- Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master.
-
- \return 0 wenn alles ok, oder < 0 wenn bereits ein Gerät registriert
- oder das Geraet nicht geöffnet werden konnte.
-*/
-
-ec_device_t *ecdev_register(unsigned int master_index,
- /**< Index des EtherCAT-Masters */
- struct net_device *net_dev,
- /**< net_device des EtherCAT-Gerätes */
- ec_isr_t isr,
- /**< Interrupt-Service-Routine */
- struct module *module
- /**< Zeiger auf das Modul */
+ Registeres an EtherCAT device for a certain master.
+ \return 0 on success, else < 0
+*/
+
+ec_device_t *ecdev_register(unsigned int master_index, /**< master index */
+ struct net_device *net_dev, /**< net_device of
+ the device */
+ ec_isr_t isr, /**< interrupt service routine */
+ struct module *module /**< pointer to the module */
)
{
ec_master_t *master;
@@ -218,13 +206,11 @@
/*****************************************************************************/
/**
- Hebt die Registrierung eines EtherCAT-Gerätes auf.
-*/
-
-void ecdev_unregister(unsigned int master_index,
- /**< Index des EtherCAT-Masters */
- ec_device_t *device
- /**< EtherCAT-Geraet */
+ Unregisteres an EtherCAT device.
+*/
+
+void ecdev_unregister(unsigned int master_index, /**< master index */
+ ec_device_t *device /**< EtherCAT device */
)
{
ec_master_t *master;
@@ -244,12 +230,10 @@
/*****************************************************************************/
/**
- Starts the master.
-*/
-
-int ecdev_start(unsigned int master_index
- /**< Index des EtherCAT-Masters */
- )
+ Starts the master associated with the device.
+*/
+
+int ecdev_start(unsigned int master_index /**< master index */)
{
ec_master_t *master;
if (!(master = ec_find_master(master_index))) return -1;
@@ -266,12 +250,10 @@
/*****************************************************************************/
/**
- Stops the master.
-*/
-
-void ecdev_stop(unsigned int master_index
- /**< Index des EtherCAT-Masters */
- )
+ Stops the master associated with the device.
+*/
+
+void ecdev_stop(unsigned int master_index /**< master index */)
{
ec_master_t *master;
if (!(master = ec_find_master(master_index))) return;
@@ -283,21 +265,16 @@
}
/******************************************************************************
- *
- * Echtzeitschnittstelle
- *
+ * Realtime interface
*****************************************************************************/
/**
- Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät.
-
- Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck.
-
- \return Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig.
+ Reserves an EtherCAT master for realtime operation.
+ \return pointer to reserved master, or NULL on error
*/
ec_master_t *ecrt_request_master(unsigned int master_index
- /**< EtherCAT-Master-Index */
+ /**< master index */
)
{
ec_master_t *master;
@@ -351,10 +328,10 @@
/*****************************************************************************/
/**
- Gibt einen zuvor angeforderten EtherCAT-Master wieder frei.
-*/
-
-void ecrt_release_master(ec_master_t *master /**< EtherCAT-Master */)
+ Releases a reserved EtherCAT master.
+*/
+
+void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
{
EC_INFO("Releasing master %i...\n", master->index);
@@ -378,10 +355,12 @@
/*****************************************************************************/
/**
- Gibt Frame-Inhalte zwecks Debugging aus.
-*/
-
-void ec_print_data(const uint8_t *data, size_t size)
+ Outputs frame contents for debugging purposes.
+*/
+
+void ec_print_data(const uint8_t *data, /**< pointer to data */
+ size_t size /**< number of bytes to output */
+ )
{
unsigned int i;
@@ -399,12 +378,12 @@
/*****************************************************************************/
/**
- Gibt Frame-Inhalte zwecks Debugging aus, differentiell.
-*/
-
-void ec_print_data_diff(const uint8_t *d1, /**< Daten 1 */
- const uint8_t *d2, /**< Daten 2 */
- size_t size /** Anzahl Bytes */
+ Outputs frame contents and differences for debugging purposes.
+*/
+
+void ec_print_data_diff(const uint8_t *d1, /**< first data */
+ const uint8_t *d2, /**< second data */
+ size_t size /** number of bytes to output */
)
{
unsigned int i;
@@ -434,9 +413,3 @@
EXPORT_SYMBOL(ecrt_release_master);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/slave.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/slave.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* s l a v e . c
*
- * Methoden für einen EtherCAT-Slave.
+ * EtherCAT slave methods.
*
* $Id$
*
@@ -63,13 +63,14 @@
/*****************************************************************************/
/**
- EtherCAT-Slave-Konstruktor.
-*/
-
-int ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
- ec_master_t *master, /**< EtherCAT-Master */
- uint16_t ring_position, /**< Ringposition */
- uint16_t station_address /**< Programmierte Adresse */
+ Slave constructor.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */
+ ec_master_t *master, /**< EtherCAT master */
+ uint16_t ring_position, /**< ring position */
+ uint16_t station_address /**< station address to configure */
)
{
unsigned int i;
@@ -77,7 +78,7 @@
slave->ring_position = ring_position;
slave->station_address = station_address;
- // Init kobject and add it to the hierarchy
+ // init kobject and add it to the hierarchy
memset(&slave->kobj, 0x00, sizeof(struct kobject));
kobject_init(&slave->kobj);
slave->kobj.ktype = &ktype_ec_slave;
@@ -133,10 +134,10 @@
/*****************************************************************************/
/**
- EtherCAT-Slave-Destruktor.
-*/
-
-void ec_slave_clear(struct kobject *kobj /**< KObject des Slaves */)
+ Slave destructor.
+*/
+
+void ec_slave_clear(struct kobject *kobj /**< kobject of the slave */)
{
ec_slave_t *slave;
ec_eeprom_string_t *string, *next_str;
@@ -148,24 +149,24 @@
slave = container_of(kobj, ec_slave_t, kobj);
- // Alle Strings freigeben
+ // free all string objects
list_for_each_entry_safe(string, next_str, &slave->eeprom_strings, list) {
list_del(&string->list);
kfree(string);
}
- // Alle Sync-Manager freigeben
+ // free all sync managers
list_for_each_entry_safe(sync, next_sync, &slave->eeprom_syncs, list) {
list_del(&sync->list);
kfree(sync);
}
- // Alle PDOs freigeben
+ // free all PDOs
list_for_each_entry_safe(pdo, next_pdo, &slave->eeprom_pdos, list) {
list_del(&pdo->list);
if (pdo->name) kfree(pdo->name);
- // Alle Entries innerhalb eines PDOs freigeben
+ // free all PDO entries
list_for_each_entry_safe(entry, next_ent, &pdo->entries, list) {
list_del(&entry->list);
if (entry->name) kfree(entry->name);
@@ -179,12 +180,12 @@
if (slave->eeprom_group) kfree(slave->eeprom_group);
if (slave->eeprom_desc) kfree(slave->eeprom_desc);
- // Alle SDOs freigeben
+ // free all SDOs
list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) {
list_del(&sdo->list);
if (sdo->name) kfree(sdo->name);
- // Alle Entries freigeben
+ // free all SDO entries
list_for_each_entry_safe(en, next_en, &sdo->entries, list) {
list_del(&en->list);
kfree(en);
@@ -198,12 +199,11 @@
/*****************************************************************************/
/**
- 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 */)
+ Reads all necessary information from a slave.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT slave */)
{
ec_command_t *command;
unsigned int i;
@@ -211,7 +211,7 @@
command = &slave->master->simple_command;
- // Read base data
+ // read base data
if (ec_command_nprd(command, slave->station_address, 0x0000, 6)) return -1;
if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Reading base data from slave %i failed!\n",
@@ -228,7 +228,7 @@
if (slave->base_fmmu_count > EC_MAX_FMMUS)
slave->base_fmmu_count = EC_MAX_FMMUS;
- // Read DL status
+ // read data link status
if (ec_command_nprd(command, slave->station_address, 0x0110, 2)) return -1;
if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Reading DL status from slave %i failed!\n",
@@ -243,7 +243,7 @@
slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
}
- // Read EEPROM data
+ // read EEPROM data
if (ec_slave_sii_read16(slave, 0x0004, &slave->sii_alias))
return -1;
if (ec_slave_sii_read32(slave, 0x0008, &slave->sii_vendor_id))
@@ -276,18 +276,16 @@
/*****************************************************************************/
/**
- Liest 16 Bit aus dem Slave-Information-Interface
- eines EtherCAT-Slaves.
-
- \return 0 bei Erfolg, sonst < 0
+ Reads 16 bit from the slave information interface (SII).
+ \return 0 in case of success, else < 0
*/
int ec_slave_sii_read16(ec_slave_t *slave,
- /**< EtherCAT-Slave */
+ /**< EtherCAT slave */
uint16_t offset,
- /**< Adresse des zu lesenden SII-Registers */
+ /**< address of the SII register to read */
uint16_t *target
- /**< Speicher für Wert (16-Bit) */
+ /**< target memory */
)
{
ec_command_t *command;
@@ -295,7 +293,7 @@
command = &slave->master->simple_command;
- // Initiate read operation
+ // initiate read operation
if (ec_command_npwr(command, slave->station_address, 0x502, 6)) return -1;
EC_WRITE_U8 (command->data, 0x00); // read-only access
EC_WRITE_U8 (command->data + 1, 0x01); // request read operation
@@ -305,10 +303,6 @@
return -1;
}
- // Der Slave legt die Informationen des Slave-Information-Interface
- // in das Datenregister und löscht daraufhin ein Busy-Bit. Solange
- // den Status auslesen, bis das Bit weg ist.
-
start = get_cycles();
timeout = (cycles_t) 100 * cpu_khz; // 100ms
@@ -326,6 +320,7 @@
end = get_cycles();
+ // check for "busy bit"
if (likely((EC_READ_U8(command->data + 1) & 0x81) == 0)) {
*target = EC_READ_U16(command->data + 6);
return 0;
@@ -341,18 +336,16 @@
/*****************************************************************************/
/**
- Liest 32 Bit aus dem Slave-Information-Interface
- eines EtherCAT-Slaves.
-
- \return 0 bei Erfolg, sonst < 0
+ Reads 32 bit from the slave information interface (SII).
+ \return 0 in case of success, else < 0
*/
int ec_slave_sii_read32(ec_slave_t *slave,
- /**< EtherCAT-Slave */
+ /**< EtherCAT slave */
uint16_t offset,
- /**< Adresse des zu lesenden SII-Registers */
+ /**< address of the SII register to read */
uint32_t *target
- /**< Speicher für Wert (32-Bit) */
+ /**< target memory */
)
{
ec_command_t *command;
@@ -360,7 +353,7 @@
command = &slave->master->simple_command;
- // Initiate read operation
+ // initiate read operation
if (ec_command_npwr(command, slave->station_address, 0x502, 6)) return -1;
EC_WRITE_U8 (command->data, 0x00); // read-only access
EC_WRITE_U8 (command->data + 1, 0x01); // request read operation
@@ -370,10 +363,6 @@
return -1;
}
- // Der Slave legt die Informationen des Slave-Information-Interface
- // in das Datenregister und löscht daraufhin ein Busy-Bit. Solange
- // den Status auslesen, bis das Bit weg ist.
-
start = get_cycles();
timeout = (cycles_t) 100 * cpu_khz; // 100ms
@@ -391,6 +380,7 @@
end = get_cycles();
+ // check "busy bit"
if (likely((EC_READ_U8(command->data + 1) & 0x81) == 0)) {
*target = EC_READ_U32(command->data + 6);
return 0;
@@ -406,18 +396,16 @@
/*****************************************************************************/
/**
- Schreibt 16 Bit Daten in das Slave-Information-Interface
- eines EtherCAT-Slaves.
-
- \return 0 bei Erfolg, sonst < 0
+ Writes 16 bit of data to the slave information interface (SII).
+ \return 0 in case of success, else < 0
*/
int ec_slave_sii_write16(ec_slave_t *slave,
- /**< EtherCAT-Slave */
+ /**< EtherCAT slave */
uint16_t offset,
- /**< Adresse des zu lesenden SII-Registers */
+ /**< address of the SII register to write */
uint16_t value
- /**< Zu schreibender Wert */
+ /**< new value */
)
{
ec_command_t *command;
@@ -428,7 +416,7 @@
EC_INFO("SII-write (slave %i, offset 0x%04X, value 0x%04X)\n",
slave->ring_position, offset, value);
- // Initiate write operation
+ // initiate write operation
if (ec_command_npwr(command, slave->station_address, 0x502, 8)) return -1;
EC_WRITE_U8 (command->data, 0x01); // enable write access
EC_WRITE_U8 (command->data + 1, 0x02); // request write operation
@@ -439,10 +427,6 @@
return -1;
}
- // Der Slave legt die Informationen des Slave-Information-Interface
- // in das Datenregister und löscht daraufhin ein Busy-Bit. Solange
- // den Status auslesen, bis das Bit weg ist.
-
start = get_cycles();
timeout = (cycles_t) 100 * cpu_khz; // 100ms
@@ -460,6 +444,7 @@
end = get_cycles();
+ // check "busy bit"
if (likely((EC_READ_U8(command->data + 1) & 0x82) == 0)) {
if (EC_READ_U8(command->data + 1) & 0x40) {
EC_ERR("SII-write failed!\n");
@@ -481,12 +466,11 @@
/*****************************************************************************/
/**
- Holt Daten aus dem EEPROM.
-
- \return 0, wenn alles ok, sonst < 0
-*/
-
-int ec_slave_fetch_categories(ec_slave_t *slave /**< EtherCAT-Slave */)
+ Fetches data from slave's EEPROM.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch_categories(ec_slave_t *slave /**< EtherCAT slave */)
{
uint16_t word_offset, cat_type, word_count;
uint32_t value;
@@ -507,13 +491,13 @@
goto out_free;
}
- // Last category?
+ // last category?
if ((value & 0xFFFF) == 0xFFFF) break;
cat_type = value & 0x7FFF;
word_count = (value >> 16) & 0xFFFF;
- // Fetch category data
+ // fetch category data
for (i = 0; i < word_count; i++) {
if (ec_slave_sii_read32(slave, word_offset + 2 + i, &value)) {
EC_ERR("Unable to read category data word %i.\n", i);
@@ -574,13 +558,12 @@
/*****************************************************************************/
/**
- Holt die Daten einer String-Kategorie.
-
- \return 0 wenn alles ok, sonst < 0
-*/
-
-int ec_slave_fetch_strings(ec_slave_t *slave, /**< EtherCAT-Slave */
- const uint8_t *data /**< Kategoriedaten */
+ Fetches data from a STRING category.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch_strings(ec_slave_t *slave, /**< EtherCAT slave */
+ const uint8_t *data /**< category data */
)
{
unsigned int string_count, i;
@@ -592,7 +575,7 @@
offset = 1;
for (i = 0; i < string_count; i++) {
size = data[offset];
- // Speicher für String-Objekt und Daten in einem Rutsch allozieren
+ // allocate memory for string structure and data at a single blow
if (!(string = (ec_eeprom_string_t *)
kmalloc(sizeof(ec_eeprom_string_t) + size + 1, GFP_KERNEL))) {
EC_ERR("Failed to allocate string memory.\n");
@@ -613,11 +596,12 @@
/*****************************************************************************/
/**
- Holt die Daten einer General-Kategorie.
-*/
-
-int ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT-Slave */
- const uint8_t *data /**< Kategorie-Daten */
+ Fetches data from a GENERAL category.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT slave */
+ const uint8_t *data /**< category data */
)
{
unsigned int i;
@@ -630,7 +614,8 @@
return -1;
for (i = 0; i < 4; i++)
- slave->sii_physical_layer[i] = (data[4] & (0x03 << (i * 2))) >> (i * 2);
+ slave->sii_physical_layer[i] =
+ (data[4] & (0x03 << (i * 2))) >> (i * 2);
return 0;
}
@@ -638,18 +623,19 @@
/*****************************************************************************/
/**
- Holt die Daten einer Sync-Manager-Kategorie.
-*/
-
-int ec_slave_fetch_sync(ec_slave_t *slave, /**< EtherCAT-Slave */
- const uint8_t *data, /**< Kategorie-Daten */
- size_t word_count /**< Anzahl Words */
+ Fetches data from a SYNC MANAGER category.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch_sync(ec_slave_t *slave, /**< EtherCAT slave */
+ const uint8_t *data, /**< category data */
+ size_t word_count /**< number of words */
)
{
unsigned int sync_count, i;
ec_eeprom_sync_t *sync;
- sync_count = word_count / 4; // Sync-Manager-Strunktur ist 4 Worte lang
+ sync_count = word_count / 4; // sync manager struct is 4 words long
for (i = 0; i < sync_count; i++, data += 8) {
if (!(sync = (ec_eeprom_sync_t *)
@@ -673,13 +659,14 @@
/*****************************************************************************/
/**
- Holt die Daten einer TXPDO-Kategorie.
-*/
-
-int ec_slave_fetch_pdo(ec_slave_t *slave, /**< EtherCAT-Slave */
- const uint8_t *data, /**< Kategorie-Daten */
- size_t word_count, /**< Anzahl Worte */
- ec_pdo_type_t pdo_type /**< PDO-Typ */
+ Fetches data from a [RT]XPDO category.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_fetch_pdo(ec_slave_t *slave, /**< EtherCAT slave */
+ const uint8_t *data, /**< category data */
+ size_t word_count, /**< number of words */
+ ec_pdo_type_t pdo_type /**< PDO type */
)
{
ec_eeprom_pdo_t *pdo;
@@ -733,7 +720,8 @@
/*****************************************************************************/
/**
- Durchsucht die temporären Strings und dupliziert den gefundenen String.
+ Searches the string list for an index and allocates a new string.
+ \return 0 in case of success, else < 0
*/
int ec_slave_locate_string(ec_slave_t *slave, unsigned int index, char **ptr)
@@ -778,13 +766,11 @@
/*****************************************************************************/
/**
- Bestätigt einen Fehler beim Zustandswechsel.
-*/
-
-void ec_slave_state_ack(ec_slave_t *slave,
- /**< Slave, dessen Zustand geändert werden soll */
- uint8_t state
- /**< Alter Zustand */
+ Acknowledges an error after a state transition.
+*/
+
+void ec_slave_state_ack(ec_slave_t *slave, /**< EtherCAT slave */
+ uint8_t state /**< previous state */
)
{
ec_command_t *command;
@@ -805,7 +791,7 @@
while (1)
{
- udelay(100); // Dem Slave etwas Zeit lassen...
+ udelay(100); // wait a little bit...
if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
return;
@@ -835,12 +821,11 @@
/**
Reads the AL status code of a slave and displays it.
-
If the AL status code is not supported, or if no error occurred (both
resulting in code=0), nothing is displayed.
*/
-void ec_slave_read_al_status_code(ec_slave_t *slave /**< EtherCAT-Slave */)
+void ec_slave_read_al_status_code(ec_slave_t *slave /**< EtherCAT slave */)
{
ec_command_t *command;
uint16_t code;
@@ -871,15 +856,12 @@
/*****************************************************************************/
/**
- Ändert den Zustand eines Slaves.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_slave_state_change(ec_slave_t *slave,
- /**< Slave, dessen Zustand geändert werden soll */
- uint8_t state
- /**< Neuer Zustand */
+ Does a state transition.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_state_change(ec_slave_t *slave, /**< EtherCAT slave */
+ uint8_t state /**< new state */
)
{
ec_command_t *command;
@@ -900,7 +882,7 @@
while (1)
{
- udelay(100); // Dem Slave etwas Zeit lassen...
+ udelay(100); // wait a little bit
if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
return -1;
@@ -912,7 +894,7 @@
end = get_cycles();
- if (unlikely(EC_READ_U8(command->data) & 0x10)) { // State change error
+ if (unlikely(EC_READ_U8(command->data) & 0x10)) { // state change error
EC_ERR("Failed to set state 0x%02X - Slave %i refused state change"
" (code 0x%02X)!\n", state, slave->ring_position,
EC_READ_U8(command->data));
@@ -922,10 +904,8 @@
return -1;
}
- if (likely(EC_READ_U8(command->data) == (state & 0x0F))) {
- // State change successful
- return 0;
- }
+ if (likely(EC_READ_U8(command->data) == (state & 0x0F)))
+ return 0; // state change successful
if (unlikely((end - start) >= timeout)) {
EC_ERR("Failed to check state 0x%02X of slave %i - Timeout!\n",
@@ -938,31 +918,30 @@
/*****************************************************************************/
/**
- Merkt eine FMMU-Konfiguration vor.
-
- Die FMMU wird so konfiguriert, dass sie den gesamten Datenbereich des
- entsprechenden Sync-Managers abdeckt. Für jede Domäne werden separate
- FMMUs konfiguriert.
-
- Wenn die entsprechende FMMU bereits konfiguriert ist, wird dies als
- Erfolg zurückgegeben.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_slave_prepare_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */
- const ec_domain_t *domain, /**< Domäne */
- const ec_sync_t *sync /**< Sync-Manager */
+ Prepares an FMMU configuration.
+ Configuration data for the FMMU is saved in the slave structure and is
+ written to the slave in ecrt_master_activate().
+ The FMMU configuration is done in a way, that the complete data range
+ of the corresponding sync manager is covered. Seperate FMMUs arce configured
+ for each domain.
+ If the FMMU configuration is already prepared, the function returns with
+ success.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_prepare_fmmu(ec_slave_t *slave, /**< EtherCAT slave */
+ const ec_domain_t *domain, /**< domain */
+ const ec_sync_t *sync /**< sync manager */
)
{
unsigned int i;
- // FMMU schon vorgemerkt?
+ // FMMU configuration already prepared?
for (i = 0; i < slave->fmmu_count; i++)
if (slave->fmmus[i].domain == domain && slave->fmmus[i].sync == sync)
return 0;
- // Neue FMMU reservieren...
+ // reserve new FMMU...
if (slave->fmmu_count >= slave->base_fmmu_count) {
EC_ERR("Slave %i FMMU limit reached!\n", slave->ring_position);
@@ -981,16 +960,15 @@
/*****************************************************************************/
/**
- Gibt alle Informationen über einen EtherCAT-Slave aus.
-
+ Outputs all information about a certain slave.
Verbosity:
- 0 - Nur Slavetypen und Adressen
- 1 - mit EEPROM-Informationen
- >1 - mit SDO-Dictionaries
-*/
-
-void ec_slave_print(const ec_slave_t *slave, /**< EtherCAT-Slave */
- unsigned int verbosity /**< Geschwätzigkeit */
+ - 0: Only slave types and addresses
+ - 1: with EEPROM information
+ - >1: with SDO dictionaries
+*/
+
+void ec_slave_print(const ec_slave_t *slave, /**< EtherCAT slave */
+ unsigned int verbosity /**< verbosity level */
)
{
ec_eeprom_sync_t *sync;
@@ -1146,12 +1124,11 @@
/*****************************************************************************/
/**
- Gibt die Zählerstände der CRC-Fault-Counter aus und setzt diese zurück.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int ec_slave_check_crc(ec_slave_t *slave /**< EtherCAT-Slave */)
+ Outputs the values of the CRC faoult counters and resets them.
+ \return 0 in case of success, else < 0
+*/
+
+int ec_slave_check_crc(ec_slave_t *slave /**< EtherCAT slave */)
{
ec_command_t *command;
@@ -1164,8 +1141,7 @@
return -1;
}
- // No CRC faults.
- if (!EC_READ_U32(command->data)) return 0;
+ if (!EC_READ_U32(command->data)) return 0; // no CRC faults
if (EC_READ_U8(command->data))
EC_WARN("%3i RX-error%s on slave %i, channel A.\n",
@@ -1188,7 +1164,7 @@
EC_READ_U8(command->data + 3) == 1 ? "" : "s",
slave->ring_position);
- // Reset CRC counters
+ // reset CRC counters
if (ec_command_npwr(command, slave->station_address, 0x0300, 4)) return -1;
EC_WRITE_U32(command->data, 0x00000000);
if (unlikely(ec_master_simple_io(slave->master, command))) {
@@ -1203,12 +1179,12 @@
/*****************************************************************************/
/**
- Schreibt den "Configured station alias".
- \return 0, wenn alles ok, sonst < 0
-*/
-
-int ecrt_slave_write_alias(ec_slave_t *slave, /** EtherCAT-Slave */
- uint16_t alias /** Neuer Alias */
+ Writes the "configured station alias" to the slave's EEPROM.
+ \return 0 in case of success, else < 0
+*/
+
+int ecrt_slave_write_alias(ec_slave_t *slave, /** EtherCAT slave */
+ uint16_t alias /** new alias */
)
{
return ec_slave_sii_write16(slave, 0x0004, alias);
@@ -1217,14 +1193,13 @@
/*****************************************************************************/
/**
- Formatiert Attribut-Daten für lesenden Zugriff im SysFS
-
- \return Anzahl Bytes im Speicher
-*/
-
-ssize_t ec_show_slave_attribute(struct kobject *kobj, /**< KObject */
- struct attribute *attr, /**< Attribut */
- char *buffer /**< Speicher für die Daten */
+ Formats attribute data for SysFS read access.
+ \return number of bytes to read
+*/
+
+ssize_t ec_show_slave_attribute(struct kobject *kobj, /**< slave's kobject */
+ struct attribute *attr, /**< attribute */
+ char *buffer /**< memory to store data */
)
{
ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj);
@@ -1287,10 +1262,3 @@
EXPORT_SYMBOL(ecrt_slave_write_alias);
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
-
--- a/master/slave.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/slave.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* s l a v e . h
*
- * Struktur für einen EtherCAT-Slave.
+ * EtherCAT stave structure.
*
* $Id$
*
@@ -21,30 +21,30 @@
/*****************************************************************************/
/**
- Zustand eines EtherCAT-Slaves.
+ State of an EtherCAT slave.
*/
typedef enum
{
EC_SLAVE_STATE_UNKNOWN = 0x00,
- /**< Status unbekannt */
+ /**< unknown state */
EC_SLAVE_STATE_INIT = 0x01,
- /**< Init-Zustand (Keine Mailbox-Kommunikation, Kein I/O) */
+ /**< INIT state (no mailbox communication, no IO) */
EC_SLAVE_STATE_PREOP = 0x02,
- /**< Pre-Operational (Mailbox-Kommunikation, Kein I/O) */
+ /**< PREOP state (mailbox communication, no IO) */
EC_SLAVE_STATE_SAVEOP = 0x04,
- /**< Save-Operational (Mailbox-Kommunikation und Input Update) */
+ /**< SAVEOP (mailbox communication and input update) */
EC_SLAVE_STATE_OP = 0x08,
- /**< Operational, (Mailbox-Kommunikation und Input/Output Update) */
+ /**< OP (mailbox communication and input/output update) */
EC_ACK = 0x10
- /**< Acknoledge-Bit beim Zustandswechsel (kein eigener Zustand) */
+ /**< Acknoledge bit (no state) */
}
ec_slave_state_t;
/*****************************************************************************/
/**
- Unterstützte Mailbox-Protokolle.
+ Supported mailbox protocols.
*/
enum
@@ -60,124 +60,124 @@
/*****************************************************************************/
/**
- FMMU-Konfiguration.
-*/
-
-typedef struct
-{
- const ec_domain_t *domain;
- const ec_sync_t *sync;
- uint32_t logical_start_address;
+ FMMU configuration.
+*/
+
+typedef struct
+{
+ const ec_domain_t *domain; /**< domain */
+ const ec_sync_t *sync; /**< sync manager */
+ uint32_t logical_start_address; /**< logical start address */
}
ec_fmmu_t;
/*****************************************************************************/
/**
- String im EEPROM eines EtherCAT-Slaves.
-*/
-
-typedef struct
-{
- struct list_head list;
- size_t size;
- char *data;
+ String object (EEPROM).
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ size_t size; /**< size in bytes */
+ char *data; /**< string data */
}
ec_eeprom_string_t;
/*****************************************************************************/
/**
- Sync-Manager-Konfiguration laut EEPROM.
-*/
-
-typedef struct
-{
- struct list_head list;
- unsigned int index;
- uint16_t physical_start_address;
- uint16_t length;
- uint8_t control_register;
- uint8_t enable;
+ Sync manager configuration (EEPROM).
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ unsigned int index; /**< sync manager index */
+ uint16_t physical_start_address; /**< physical start address */
+ uint16_t length; /**< data length in bytes */
+ uint8_t control_register; /**< control register value */
+ uint8_t enable; /**< enable bit */
}
ec_eeprom_sync_t;
/*****************************************************************************/
/**
- PDO-Typ.
+ PDO type.
*/
typedef enum
{
- EC_RX_PDO,
- EC_TX_PDO
+ EC_RX_PDO, /**< Reveive PDO */
+ EC_TX_PDO /**< Transmit PDO */
}
ec_pdo_type_t;
/*****************************************************************************/
/**
- PDO-Beschreibung im EEPROM.
-*/
-
-typedef struct
-{
- struct list_head list;
- ec_pdo_type_t type;
- uint16_t index;
- uint8_t sync_manager;
- char *name;
- struct list_head entries;
+ PDO description (EEPROM).
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ ec_pdo_type_t type; /**< PDO type */
+ uint16_t index; /**< PDO index */
+ uint8_t sync_manager; /**< assigned sync manager */
+ char *name; /**< PDO name */
+ struct list_head entries; /**< entry list */
}
ec_eeprom_pdo_t;
/*****************************************************************************/
/**
- PDO-Entry-Beschreibung im EEPROM.
-*/
-
-typedef struct
-{
- struct list_head list;
- uint16_t index;
- uint8_t subindex;
- char *name;
- uint8_t bit_length;
+ PDO entry description (EEPROM).
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ uint16_t index; /**< PDO index */
+ uint8_t subindex; /**< entry subindex */
+ char *name; /**< entry name */
+ uint8_t bit_length; /**< entry length in bit */
}
ec_eeprom_pdo_entry_t;
/*****************************************************************************/
/**
- CANopen-SDO.
-*/
-
-typedef struct
-{
- struct list_head list;
- uint16_t index;
+ CANopen SDO.
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ uint16_t index; /**< SDO index */
//uint16_t type;
- uint8_t object_code;
- char *name;
- struct list_head entries;
+ uint8_t object_code; /**< object code */
+ char *name; /**< SDO name */
+ struct list_head entries; /**< entry list */
}
ec_sdo_t;
/*****************************************************************************/
/**
- CANopen-SDO-Entry.
-*/
-
-typedef struct
-{
- struct list_head list;
- uint8_t subindex;
- uint16_t data_type;
- uint16_t bit_length;
- char *name;
+ CANopen SDO entry.
+*/
+
+typedef struct
+{
+ struct list_head list; /**< list item */
+ uint8_t subindex; /**< entry subindex */
+ uint16_t data_type; /**< entry data type */
+ uint16_t bit_length; /**< entry length in bit */
+ char *name; /**< entry name */
}
ec_sdo_entry_t;
@@ -189,69 +189,68 @@
struct ec_slave
{
- struct list_head list; /**< Noetig fuer Slave-Liste im Master */
- struct kobject kobj; /**< Kernel-Object */
- ec_master_t *master; /**< EtherCAT-Master, zu dem der Slave gehört. */
-
- // Addresses
- uint16_t ring_position; /**< Position des Slaves im Bus */
- uint16_t station_address; /**< Konfigurierte Slave-Adresse */
- uint16_t coupler_index; /**< Letzter Buskoppler */
- uint16_t coupler_subindex; /**< Index hinter letztem Buskoppler */
-
- // Base data
- uint8_t base_type; /**< Slave-Typ */
- uint8_t base_revision; /**< Revision */
- uint16_t base_build; /**< Build-Nummer */
- uint16_t base_fmmu_count; /**< Anzahl unterstützter FMMUs */
- uint16_t base_sync_count; /**< Anzahl unterstützter Sync-Manager */
-
- // Data link status
- uint8_t dl_link[4]; /**< Verbindung erkannt */
- uint8_t dl_loop[4]; /**< Loop geschlossen */
- uint8_t dl_signal[4]; /**< Signal an RX-Seite erkannt */
-
- // Slave information interface
- uint16_t sii_alias; /**< Configured station alias */
- uint32_t sii_vendor_id; /**< Identifikationsnummer des Herstellers */
- uint32_t sii_product_code; /**< Herstellerspezifischer Produktcode */
- uint32_t sii_revision_number; /**< Revisionsnummer */
- uint32_t sii_serial_number; /**< Seriennummer der Klemme */
- uint16_t sii_rx_mailbox_offset; /**< Adresse der Mailbox (Master->Slave) */
- uint16_t sii_rx_mailbox_size; /**< Adresse der Mailbox (Master->Slave) */
- uint16_t sii_tx_mailbox_offset; /**< Adresse der Mailbox (Slave->Master) */
- uint16_t sii_tx_mailbox_size; /**< Adresse der Mailbox (Slave->Master) */
- uint16_t sii_mailbox_protocols; /**< Unterstützte Mailbox-Protokolle */
- uint8_t sii_physical_layer[4]; /**< Uebertragungsarten der Ports */
-
- const ec_slave_type_t *type; /**< Zeiger auf die Beschreibung
- des Slave-Typs */
-
- uint8_t registered; /**< Der Slave wurde registriert */
-
- ec_fmmu_t fmmus[EC_MAX_FMMUS]; /**< FMMU-Konfigurationen */
- uint8_t fmmu_count; /**< Wieviele FMMUs schon benutzt sind. */
-
- struct list_head eeprom_strings; /**< Strings im EEPROM */
- struct list_head eeprom_syncs; /**< Syncmanager-Konfigurationen (EEPROM) */
- struct list_head eeprom_pdos; /**< PDO-Beschreibungen im EEPROM */
-
- char *eeprom_name; /**< Slave-Name laut Hersteller */
- char *eeprom_group; /**< Slave-Beschreibung laut Hersteller */
- char *eeprom_desc; /**< Slave-Beschreibung laut Hersteller */
-
- struct list_head sdo_dictionary; /**< SDO-Verzeichnis des Slaves */
-
- ec_command_t mbox_command; /**< Kommando für Mailbox-Kommunikation */
+ struct list_head list; /**< list item */
+ struct kobject kobj; /**< kobject */
+ ec_master_t *master; /**< master owning the slave */
+
+ // addresses
+ uint16_t ring_position; /**< ring position */
+ uint16_t station_address; /**< configured station address */
+ uint16_t coupler_index; /**< index of the last bus coupler */
+ uint16_t coupler_subindex; /**< index of this slave after last coupler */
+
+ // base data
+ uint8_t base_type; /**< slave type */
+ uint8_t base_revision; /**< revision */
+ uint16_t base_build; /**< build number */
+ uint16_t base_fmmu_count; /**< number of supported FMMUs */
+ uint16_t base_sync_count; /**< number of supported sync managers */
+
+ // data link status
+ uint8_t dl_link[4]; /**< link detected */
+ uint8_t dl_loop[4]; /**< loop closed */
+ uint8_t dl_signal[4]; /**< detected signal on RX port */
+
+ // slave information interface
+ uint16_t sii_alias; /**< configured station alias */
+ uint32_t sii_vendor_id; /**< vendor id */
+ uint32_t sii_product_code; /**< vendor's product code */
+ uint32_t sii_revision_number; /**< revision number */
+ uint32_t sii_serial_number; /**< serial number */
+ uint16_t sii_rx_mailbox_offset; /**< mailbox address (master to slave) */
+ uint16_t sii_rx_mailbox_size; /**< mailbox size (master to slave) */
+ uint16_t sii_tx_mailbox_offset; /**< mailbox address (slave to master) */
+ uint16_t sii_tx_mailbox_size; /**< mailbox size (slave to master) */
+ uint16_t sii_mailbox_protocols; /**< supported mailbox protocols */
+ uint8_t sii_physical_layer[4]; /**< port media */
+
+ const ec_slave_type_t *type; /**< pointer to slave type object */
+
+ uint8_t registered; /**< true, if slave has been registered */
+
+ ec_fmmu_t fmmus[EC_MAX_FMMUS]; /**< FMMU configurations */
+ uint8_t fmmu_count; /**< number of FMMUs used */
+
+ struct list_head eeprom_strings; /**< EEPROM STRING categories */
+ struct list_head eeprom_syncs; /**< EEPROM SYNC MANAGER categories */
+ struct list_head eeprom_pdos; /**< EEPROM [RT]XPDO categories */
+
+ char *eeprom_name; /**< slave name acc. to EEPROM */
+ char *eeprom_group; /**< slave group acc. to EEPROM */
+ char *eeprom_desc; /**< slave description acc. to EEPROM */
+
+ struct list_head sdo_dictionary; /**< SDO directory list */
+
+ ec_command_t mbox_command; /**< mailbox command */
};
/*****************************************************************************/
-// Slave construction/destruction
+// slave construction/destruction
int ec_slave_init(ec_slave_t *, ec_master_t *, uint16_t, uint16_t);
void ec_slave_clear(struct kobject *);
-// Slave control
+// slave control
int ec_slave_fetch(ec_slave_t *);
int ec_slave_sii_read16(ec_slave_t *, uint16_t, uint16_t *);
int ec_slave_sii_read32(ec_slave_t *, uint16_t, uint32_t *);
@@ -260,19 +259,13 @@
int ec_slave_prepare_fmmu(ec_slave_t *, const ec_domain_t *,
const ec_sync_t *);
-// CANopen over EtherCAT
+// CoE
int ec_slave_fetch_sdo_list(ec_slave_t *);
-// Misc
+// misc.
void ec_slave_print(const ec_slave_t *, unsigned int);
int ec_slave_check_crc(ec_slave_t *);
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/types.c Thu Apr 20 13:19:36 2006 +0000
+++ b/master/types.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* t y p e s . c
*
- * EtherCAT-Slave-Typen.
+ * EtherCAT slave descriptions.
*
* $Id$
*
@@ -18,36 +18,34 @@
const ec_sync_t mailbox_sm0 = {0x1800, 246, 0x26, {NULL}};
const ec_sync_t mailbox_sm1 = {0x18F6, 246, 0x22, {NULL}};
-/*****************************************************************************/
-
-/* Klemmen-Objekte */
-
-/*****************************************************************************/
+/******************************************************************************
+ * slave objects
+ *****************************************************************************/
const ec_slave_type_t Beckhoff_EK1100 = {
"Beckhoff", "EK1100", "Bus Coupler", EC_TYPE_BUS_COUPLER,
- {NULL} // Keine Sync-Manager
+ {NULL} // no sync managers
};
/*****************************************************************************/
const ec_slave_type_t Beckhoff_EK1110 = {
"Beckhoff", "EK1110", "Extension terminal", EC_TYPE_NORMAL,
- {NULL} // Keine Sync-Manager
+ {NULL} // no sync managers
};
/*****************************************************************************/
const ec_slave_type_t Beckhoff_BK1120 = {
"Beckhoff", "BK1120", "KBUS Coupler", EC_TYPE_NORMAL,
- {NULL} // Keine Sync-Manager
+ {NULL} // no sync managers
};
/*****************************************************************************/
const ec_field_t el1014_in = {"InputValue", 1};
-const ec_sync_t el1014_sm0 = { // Inputs
+const ec_sync_t el1014_sm0 = { // inputs
0x1000, 1, 0x00,
{&el1014_in, NULL}
};
@@ -195,15 +193,10 @@
/*****************************************************************************/
/**
- Beziehung zwischen Identifikationsnummern und Klemmen-Objekt.
-
- Diese Tabelle stellt die Beziehungen zwischen bestimmten Kombinationen
- aus Vendor-IDs und Product-Codes und der entsprechenden Klemme her.
- Neue Klemmen müssen hier eingetragen werden.
+ Mapping between vendor IDs and product codes <=> slave objects.
*/
-ec_slave_ident_t slave_idents[] =
-{
+ec_slave_ident_t slave_idents[] = {
{0x00000002, 0x03F63052, &Beckhoff_EL1014},
{0x00000002, 0x044C2C52, &Beckhoff_EK1100},
{0x00000002, 0x04562C52, &Beckhoff_EK1110},
@@ -222,9 +215,3 @@
};
/*****************************************************************************/
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/master/types.h Thu Apr 20 13:19:36 2006 +0000
+++ b/master/types.h Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* t y p e s . h
*
- * EtherCAT-Slave-Typen.
+ * EtherCAT slave types.
*
* $Id$
*
@@ -23,27 +23,27 @@
/*****************************************************************************/
/**
- Besondere Slaves.
+ Special slaves.
*/
typedef enum
{
- EC_TYPE_NORMAL,
- EC_TYPE_BUS_COUPLER,
- EC_TYPE_EOE
+ EC_TYPE_NORMAL, /**< no special slave */
+ EC_TYPE_BUS_COUPLER, /**< slave is a bus coupler */
+ EC_TYPE_EOE /**< slave is an EoE switch */
}
ec_special_type_t;
/*****************************************************************************/
/**
- Prozessdatenfeld.
+ Process data field.
*/
typedef struct
{
- const char *name;
- size_t size;
+ const char *name; /**< field name */
+ size_t size; /**< field size in bytes */
}
ec_field_t;
@@ -55,60 +55,45 @@
typedef struct
{
- uint16_t physical_start_address;
- uint16_t size;
- uint8_t control_byte;
- const ec_field_t *fields[EC_MAX_FIELDS];
+ uint16_t physical_start_address; /**< physical start address */
+ uint16_t size; /**< size in bytes */
+ uint8_t control_byte; /**< control register value */
+ const ec_field_t *fields[EC_MAX_FIELDS]; /**< field array */
}
ec_sync_t;
/*****************************************************************************/
/**
- 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 FMMUs.
+ Slave description type.
*/
typedef struct ec_slave_type
{
- const char *vendor_name; /**< Name des Herstellers */
- const char *product_name; /**< Name des Slaves-Typs */
- const char *description; /**< Genauere Beschreibung des Slave-Typs */
- ec_special_type_t special; /**< Spezieller Slave-Typ */
- const ec_sync_t *sync_managers[EC_MAX_SYNC]; /**< Sync-Manager
- Konfigurationen */
+ const char *vendor_name; /**< vendor name*/
+ const char *product_name; /**< product name */
+ const char *description; /**< free description */
+ ec_special_type_t special; /**< special slave type? */
+ const ec_sync_t *sync_managers[EC_MAX_SYNC]; /**< sync managers */
}
ec_slave_type_t;
/*****************************************************************************/
/**
- Identifikation eines Slave-Typs.
-
- Diese Struktur wird zur 1:n-Zuordnung von Hersteller- und
- Produktcodes zu den einzelnen Slave-Typen verwendet.
+ Slave type identification.
*/
-typedef struct slave_ident
+typedef struct
{
- uint32_t vendor_id; /**< Hersteller-Code */
- uint32_t product_code; /**< Herstellerspezifischer Produktcode */
- const ec_slave_type_t *type; /**< Zeiger auf den entsprechenden Typ */
+ uint32_t vendor_id; /**< vendor id */
+ uint32_t product_code; /**< product code */
+ const ec_slave_type_t *type; /**< associated slave description object */
}
ec_slave_ident_t;
-extern ec_slave_ident_t slave_idents[]; /**< Statisches Array der
- Slave-Identifikationen */
+extern ec_slave_ident_t slave_idents[]; /**< array with slave descriptions */
/*****************************************************************************/
#endif
-
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/mini/Makefile Thu Apr 20 13:19:36 2006 +0000
+++ b/mini/Makefile Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
#
# Makefile
#
-# Minimales EtherCAT-Modul
+# Minimal EtherCAT module.
#
# $Id$
#
@@ -11,7 +11,7 @@
ifneq ($(KERNELRELEASE),)
#----------------------------------------------------------------
-# Kbuild-Abschnitt
+# kbuild section
#----------------------------------------------------------------
obj-m := ec_mini.o
@@ -23,7 +23,7 @@
else
#----------------------------------------------------------------
-# Default-Abschnitt
+# default section
#----------------------------------------------------------------
ifneq ($(wildcard ethercat.conf),)
--- a/mini/mini.c Thu Apr 20 13:19:36 2006 +0000
+++ b/mini/mini.c Thu Apr 20 13:31:31 2006 +0000
@@ -2,7 +2,7 @@
*
* m i n i . c
*
- * Minimalmodul für EtherCAT
+ * Minimal module for EtherCAT.
*
* $Id$
*
@@ -12,31 +12,28 @@
#include <linux/delay.h>
#include <linux/timer.h>
-#include "../include/ecrt.h" // Echtzeitschnittstelle
+#include "../include/ecrt.h" // EtherCAT realtime interface
#define ASYNC
-
-/*****************************************************************************/
-
-#define ABTASTFREQUENZ 100
+#define FREQUENCY 100
+
+/*****************************************************************************/
struct timer_list timer;
-/*****************************************************************************/
-
// EtherCAT
ec_master_t *master = NULL;
ec_domain_t *domain1 = NULL;
-// Datenfelder
+// data fields
//void *r_ssi_input, *r_ssi_status, *r_4102[3];
-// Kanäle
+// channels
uint32_t k_pos;
uint8_t k_stat;
ec_field_init_t domain1_fields[] = {
- {NULL, "1", "Beckhoff", "EL5001", "InputValue", 0},
+ {NULL, "1", "Beckhoff", "EL5001", "InputValue", 0},
{NULL, "2", "Beckhoff", "EL4132", "OutputValue", 0},
{}
};
@@ -48,22 +45,22 @@
static unsigned int counter = 0;
#ifdef ASYNC
- // Empfangen
+ // receive
ecrt_master_async_receive(master);
ecrt_domain_process(domain1);
#else
- // Senden und empfangen
+ // send and receive
ecrt_domain_queue(domain1);
ecrt_master_run(master);
ecrt_master_sync_io(master);
ecrt_domain_process(domain1);
#endif
- // Prozessdaten verarbeiten
+ // process data
//k_pos = EC_READ_U32(r_ssi);
#ifdef ASYNC
- // Senden
+ // send
ecrt_domain_queue(domain1);
ecrt_master_run(master);
ecrt_master_async_send(master);
@@ -73,13 +70,13 @@
counter--;
}
else {
- counter = ABTASTFREQUENZ;
+ counter = FREQUENCY;
//printk(KERN_INFO "k_pos = %i\n", k_pos);
//printk(KERN_INFO "k_stat = 0x%02X\n", k_stat);
}
- // Timer neu starten
- timer.expires += HZ / ABTASTFREQUENZ;
+ // restart timer
+ timer.expires += HZ / FREQUENCY;
add_timer(&timer);
}
@@ -153,14 +150,14 @@
#endif
#ifdef ASYNC
- // Einmal senden und warten...
+ // send once and wait...
ecrt_master_prepare_async_io(master);
#endif
printk("Starting cyclic sample thread.\n");
init_timer(&timer);
timer.function = run;
- timer.expires = jiffies + 10; // Das erste Mal sofort feuern
+ timer.expires = jiffies + 10;
add_timer(&timer);
printk(KERN_INFO "=== Minimal EtherCAT environment started. ===\n");
@@ -203,8 +200,3 @@
/*****************************************************************************/
-/* Emacs-Konfiguration
-;;; Local Variables: ***
-;;; c-basic-offset:4 ***
-;;; End: ***
-*/
--- a/rt/Makefile Thu Apr 20 13:19:36 2006 +0000
+++ b/rt/Makefile Thu Apr 20 13:31:31 2006 +0000
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
#
-# Makefile Echtzeitmodule
+# Makefile
#
# $Id$
#
@@ -9,7 +9,7 @@
ifneq ($(KERNELRELEASE),)
#------------------------------------------------------------------------------
-# Kbuild-Abschnitt
+# kbuild section
#------------------------------------------------------------------------------
ifneq ($(wildcard $(src)/rt.conf),)
@@ -44,7 +44,7 @@
else
#------------------------------------------------------------------------------
-# Default-Abschnitt
+# default section
#------------------------------------------------------------------------------
ifneq ($(wildcard rt.conf),)
--- a/rt/msrserv.pl Thu Apr 20 13:19:36 2006 +0000
+++ b/rt/msrserv.pl Thu Apr 20 13:31:31 2006 +0000
@@ -2,14 +2,6 @@
#------------------------------------------------------------
#
# (C) Copyright
-# Diese Software ist geistiges Eigentum der
-# Ingenieurgemeinschaft IgH. Sie darf von
-# Toyota Motorsport GmbH
-# beliebig kopiert und veraendert werden.
-# Die Weitergabe an Dritte ist untersagt.
-# Dieser Urhebrrechtshinweis muss erhalten
-# bleiben.
-#
# Ingenieurgemeinschaft IgH
# Heinz-Baecker-Strasse 34
# D-45356 Essen
@@ -20,13 +12,13 @@
#
#------------------------------------------------------------
#
-# Multithreaded Server
+# Multithreaded Server
# according to the example from "Programming Perl"
-# this code is improved according to the example from
-# perldoc perlipc, so now safely being usable under Perl 5.8
+# this code is improved according to the example from
+# perldoc perlipc, so now safely being usable under Perl 5.8
# (see note (*))
#
-# works with read/write on a device-file
+# works with read/write on a device-file
#
# $Revision: 1.1 $
# $Date: 2004/10/01 16:00:42 $
@@ -40,9 +32,9 @@
use Socket;
use Carp;
use FileHandle;
-use Getopt::Std;
-
-use Sys::Syslog qw(:DEFAULT setlogsock);
+use Getopt::Std;
+
+use Sys::Syslog qw(:DEFAULT setlogsock);
use vars qw (
$self $pid $dolog $port $dev %opts $selfbase
@@ -53,25 +45,25 @@
# Do logging to local syslogd by unix-domain socket instead of inetd
-setlogsock("unix");
+setlogsock("unix");
# Prototypes and some little Tools
sub spawn;
-sub logmsg {
+sub logmsg {
my ($level, $debug, @text) = @_;
syslog("daemon|$level", @text) if $debug > $dolog;
# print STDERR "daemon|$level", @text, "\n" if $dolog;
}
sub out {
- my $waitpid = wait;
+ my $waitpid = wait;
logmsg("notice", 2, "$waitpid exited");
unlink "$selfbase.pid";
exit 0;
}
sub help {
- print "\n usage: $0 [-l og] [-h elp] [-p port] [-d device]\n";
- exit;
+ print "\n usage: $0 [-l og] [-h elp] [-p port] [-d device]\n";
+ exit;
}
# Process Options
@@ -81,7 +73,7 @@
"p" => 2345,
"d" => "/dev/msr"
);
-
+
getopts("lhp:d:", \%opts);
help if $opts{"h"};
@@ -94,7 +86,7 @@
$dev = $opts{"d"};
$blksize = 1024; # try to write as much bytes
$instdir = "/opt/msr";
-$authfile = "$instdir/etc/hosts.auth";
+$authfile = "$instdir/etc/hosts.auth";
# Start logging
openlog($self, 'pid');
@@ -127,12 +119,12 @@
or die "setsocketopt: $!";
bind (Server, sockaddr_in($port, INADDR_ANY))
or die "bind: $!";
-listen (Server, SOMAXCONN)
+listen (Server, SOMAXCONN)
or die "listen: $!";
%authhosts = ();
# get authorized hosts
-open (AUTH, $authfile)
+open (AUTH, $authfile)
or logmsg ("notice", 2, "Could not read allowed hosts file: $authfile");
while (<AUTH>) {
chomp;
@@ -176,26 +168,26 @@
my $name = lc gethostbyaddr($iaddr, AF_INET);
my $ipaddr = inet_ntoa($iaddr);
my $n = 0;
-
+
# tell about the requesting client
logmsg ("info", 2, "Connection from >$ipaddr< ($name) at port $port");
-
+
spawn sub {
my ($head, $hlen, $pos, $pegel, $typ, $siz, $nch, $nrec, $dat, $i, $j, $n, $llen);
my ($watchpegel, $shmpegel);
my ($rin, $rout, $in, $line, $data_requested, $oversample);
my (@channels);
-
+
# to use stdio on writing to Client
Client->autoflush();
-
-# Open Device
+
+# Open Device
sysopen (DEV, "$dev", O_RDWR | O_NONBLOCK, 0666) or die("can't open $dev");
-
+
# Bitmask to check for input on stdin
$rin = "";
- vec($rin, fileno(Client), 1) = 1;
-
+ vec($rin, fileno(Client), 1) = 1;
+
# check for authorized hosts
my $access = 'deny';
$access = 'allow' if $authhosts{$ipaddr};
@@ -208,14 +200,14 @@
$len -= $written;
$offset += $written;
}
-
+
while ( 1 ) {
$in = select ($rout=$rin, undef, undef, 0.0); # poll client
# look for any Input from Client
if ($in) {
# exit on EOF
$len = sysread (Client, $line, $blksize) or exit;
- logmsg("info", 0, "got $len bytes: \"$line\"");
+ logmsg("info", 0, "got $len bytes: \"$line\"");
$offset = 0;
# copy request to device
while ($len) {
@@ -239,11 +231,11 @@
sub spawn {
my $coderef = shift;
-
+
unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
confess "usage: spawn CODEREF";
}
- my $pid;
+ my $pid;
if (!defined($pid = fork)) {
logmsg ("notice", 2, "fork failed: $!");
return;
@@ -258,15 +250,3 @@
# STDOUT->autoflush();
exit &$coderef();
}
-
-
-
-
-
-
-
-
-
-
-
-