master/command.c
changeset 98 f564d0929292
child 104 052bc82d5442
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/master/command.c	Mon Mar 06 15:12:34 2006 +0000
@@ -0,0 +1,235 @@
+/******************************************************************************
+ *
+ *  c o m m a n d . c
+ *
+ *  Methoden für ein EtherCAT-Kommando.
+ *
+ *  $Id$
+ *
+ *****************************************************************************/
+
+#include <linux/slab.h>
+#include <linux/delay.h>
+
+#include "../include/EtherCAT_si.h"
+#include "command.h"
+#include "master.h"
+
+/*****************************************************************************/
+
+#define EC_FUNC_HEADER \
+    command->index = 0; \
+    command->working_counter = 0; \
+    command->state = EC_CMD_INIT;
+
+#define EC_FUNC_WRITE_FOOTER \
+    command->data_size = data_size; \
+    memcpy(command->data, data, data_size);
+
+#define EC_FUNC_READ_FOOTER \
+    command->data_size = data_size; \
+    memset(command->data, 0x00, data_size);
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-NPRD-Kommando.
+
+   Node-adressed physical read.
+*/
+
+void ec_command_init_nprd(ec_command_t *command,
+                          /**< EtherCAT-Rahmen */
+                          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 */
+                          )
+{
+    if (unlikely(node_address == 0x0000))
+        EC_WARN("Using node address 0x0000!\n");
+
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_NPRD;
+    command->address.physical.slave = node_address;
+    command->address.physical.mem = offset;
+
+    EC_FUNC_READ_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-NPWR-Kommando.
+
+   Node-adressed physical write.
+*/
+
+void ec_command_init_npwr(ec_command_t *command,
+                          /**< EtherCAT-Rahmen */
+                          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 */
+                          const uint8_t *data
+                          /**< Zeiger auf Speicher mit zu schreibenden Daten */
+                          )
+{
+    if (unlikely(node_address == 0x0000))
+        EC_WARN("Using node address 0x0000!\n");
+
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_NPWR;
+    command->address.physical.slave = node_address;
+    command->address.physical.mem = offset;
+
+    EC_FUNC_WRITE_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-APRD-Kommando.
+
+   Autoincrement physical read.
+*/
+
+void ec_command_init_aprd(ec_command_t *command,
+                          /**< EtherCAT-Rahmen */
+                          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 */
+                          )
+{
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_APRD;
+    command->address.physical.slave = (int16_t) ring_position * (-1);
+    command->address.physical.mem = offset;
+
+    EC_FUNC_READ_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-APWR-Kommando.
+
+   Autoincrement physical write.
+*/
+
+void ec_command_init_apwr(ec_command_t *command,
+                          /**< EtherCAT-Rahmen */
+                          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 */
+                          const uint8_t *data
+                          /**< Zeiger auf Speicher mit zu schreibenden Daten */
+                          )
+{
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_APWR;
+    command->address.physical.slave = (int16_t) ring_position * (-1);
+    command->address.physical.mem = offset;
+
+    EC_FUNC_WRITE_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-BRD-Kommando.
+
+   Broadcast read.
+*/
+
+void ec_command_init_brd(ec_command_t *command,
+                         /**< EtherCAT-Rahmen */
+                         uint16_t offset,
+                         /**< Physikalische Speicheradresse im Slave */
+                         size_t data_size
+                         /**< Länge der zu lesenden Daten */
+                         )
+{
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_BRD;
+    command->address.physical.slave = 0x0000;
+    command->address.physical.mem = offset;
+
+    EC_FUNC_READ_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-BWR-Kommando.
+
+   Broadcast write.
+*/
+
+void ec_command_init_bwr(ec_command_t *command,
+                         /**< EtherCAT-Rahmen */
+                         uint16_t offset,
+                         /**< Physikalische Speicheradresse im Slave */
+                         size_t data_size,
+                         /**< Länge der zu schreibenden Daten */
+                         const uint8_t *data
+                         /**< Zeiger auf Speicher mit zu schreibenden Daten */
+                         )
+{
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_BWR;
+    command->address.physical.slave = 0x0000;
+    command->address.physical.mem = offset;
+
+    EC_FUNC_WRITE_FOOTER;
+}
+
+/*****************************************************************************/
+
+/**
+   Initialisiert ein EtherCAT-LRW-Kommando.
+
+   Logical read write.
+*/
+
+void ec_command_init_lrw(ec_command_t *command,
+                         /**< EtherCAT-Rahmen */
+                         uint32_t offset,
+                         /**< Logische Startadresse */
+                         size_t data_size,
+                         /**< Länge der zu lesenden/schreibenden Daten */
+                         uint8_t *data
+                         /**< Zeiger auf die Daten */
+                         )
+{
+    EC_FUNC_HEADER;
+
+    command->type = EC_CMD_LRW;
+    command->address.logical = offset;
+
+    EC_FUNC_WRITE_FOOTER;
+}
+
+/*****************************************************************************/
+
+/* Emacs-Konfiguration
+;;; Local Variables: ***
+;;; c-basic-offset:4 ***
+;;; End: ***
+*/