--- a/drivers/ec_command.c Fri Nov 11 11:20:55 2005 +0000
+++ b/drivers/ec_command.c Fri Nov 11 13:46:41 2005 +0000
@@ -12,6 +12,7 @@
#include <linux/slab.h>
#include "ec_command.h"
+#include "ec_dbg.h"
/***************************************************************/
@@ -20,7 +21,7 @@
Initialisiert alle Variablen innerhalb des Kommandos auf die
Default-Werte.
-
+
@param cmd Zeiger auf das zu initialisierende Kommando.
*/
@@ -41,7 +42,7 @@
Kommando-Destruktor.
Setzt alle Attribute auf den Anfangswert zurueck.
-
+
@param cmd Zeiger auf das zu initialisierende Kommando.
*/
@@ -51,3 +52,215 @@
}
/***************************************************************/
+
+#define ECAT_FUNC_HEADER \
+ EtherCAT_command_init(cmd)
+
+#define ECAT_FUNC_WRITE_FOOTER \
+ cmd->data_length = length; \
+ memcpy(cmd->data, data, length);
+
+#define ECAT_FUNC_READ_FOOTER \
+ cmd->data_length = length;
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-NPRD-Kommando.
+
+ @param cmd Zeiger auf das Kommando
+ @param node_address Adresse des Knotens (Slaves)
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu lesenden Daten
+*/
+
+void EtherCAT_command_read(EtherCAT_command_t *cmd,
+ unsigned short node_address,
+ unsigned short offset,
+ unsigned int length)
+{
+ if (node_address == 0x0000)
+ EC_DBG(KERN_WARNING "EtherCAT: Using node address 0x0000!\n");
+
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_NPRD;
+ cmd->address.phy.dev.node = node_address;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_READ_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-NPWR-Kommando.
+
+ Alloziert ein "node-adressed physical write"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param node_address Adresse des Knotens (Slaves)
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu schreibenden Daten
+ @param data Zeiger auf Speicher mit zu schreibenden Daten
+*/
+
+void EtherCAT_command_write(EtherCAT_command_t *cmd,
+ unsigned short node_address,
+ unsigned short offset,
+ unsigned int length,
+ const unsigned char *data)
+{
+ if (node_address == 0x0000)
+ EC_DBG(KERN_WARNING "WARNING: Using node address 0x0000!\n");
+
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_NPWR;
+ cmd->address.phy.dev.node = node_address;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_WRITE_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-APRD-Kommando.
+
+ Alloziert ein "autoincerement physical read"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param ring_position (Negative) Position des Slaves im Bus
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu lesenden Daten
+*/
+
+void EtherCAT_command_position_read(EtherCAT_command_t *cmd,
+ short ring_position,
+ unsigned short offset,
+ unsigned int length)
+{
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_APRD;
+ cmd->address.phy.dev.pos = ring_position;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_READ_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-APWR-Kommando.
+
+ Alloziert ein "autoincrement physical write"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param ring_position (Negative) Position des Slaves im Bus
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu schreibenden Daten
+ @param data Zeiger auf Speicher mit zu schreibenden Daten
+*/
+
+void EtherCAT_command_position_write(EtherCAT_command_t *cmd,
+ short ring_position,
+ unsigned short offset,
+ unsigned int length,
+ const unsigned char *data)
+{
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_APWR;
+ cmd->address.phy.dev.pos = ring_position;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_WRITE_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-BRD-Kommando.
+
+ Alloziert ein "broadcast read"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu lesenden Daten
+*/
+
+void EtherCAT_command_broadcast_read(EtherCAT_command_t *cmd,
+ unsigned short offset,
+ unsigned int length)
+{
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_BRD;
+ cmd->address.phy.dev.node = 0x0000;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_READ_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-BWR-Kommando.
+
+ Alloziert ein "broadcast write"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param offset Physikalische Speicheradresse im Slave
+ @param length Länge der zu schreibenden Daten
+ @param data Zeiger auf Speicher mit zu schreibenden Daten
+*/
+
+void EtherCAT_command_broadcast_write(EtherCAT_command_t *cmd,
+ unsigned short offset,
+ unsigned int length,
+ const unsigned char *data)
+{
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_BWR;
+ cmd->address.phy.dev.node = 0x0000;
+ cmd->address.phy.mem = offset;
+
+ ECAT_FUNC_WRITE_FOOTER;
+}
+
+/***************************************************************/
+
+/**
+ Initialisiert ein EtherCAT-LRW-Kommando.
+
+ Alloziert ein "logical read write"-Kommando
+ und fügt es in die Liste des Masters ein.
+
+ @param cmd Zeiger auf das Kommando
+ @param offset Logische Speicheradresse
+ @param length Länge der zu lesenden/schreibenden Daten
+ @param data Zeiger auf Speicher mit zu lesenden/schreibenden Daten
+*/
+
+void EtherCAT_command_logical_read_write(EtherCAT_command_t *cmd,
+ unsigned int offset,
+ unsigned int length,
+ unsigned char *data)
+{
+ ECAT_FUNC_HEADER;
+
+ cmd->type = ECAT_CMD_LRW;
+ cmd->address.logical = offset;
+
+ ECAT_FUNC_WRITE_FOOTER;
+}
+
+/***************************************************************/