diff -r 6b3b8acb71b5 -r 7506e67dd122 master/command.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/master/command.c Tue Jan 17 18:28:15 2006 +0000 @@ -0,0 +1,250 @@ +/****************************************************************************** + * + * c o m m a n d . c + * + * Methoden für ein EtherCAT-Kommando. + * + * $Id$ + * + *****************************************************************************/ + +#include + +#include "command.h" + +/*****************************************************************************/ + +/** + Kommando-Konstruktor. + + Initialisiert alle Variablen innerhalb des Kommandos auf die + Default-Werte. + + @param cmd Zeiger auf das zu initialisierende Kommando. +*/ + +void ec_command_init(ec_command_t *cmd) +{ + cmd->type = EC_COMMAND_NONE; + cmd->address.logical = 0x00000000; + cmd->data_length = 0; + cmd->state = EC_COMMAND_STATE_READY; + cmd->index = 0; + cmd->working_counter = 0; +} + +/*****************************************************************************/ + +/** + Kommando-Destruktor. + + Setzt alle Attribute auf den Anfangswert zurueck. + + @param cmd Zeiger auf das zu initialisierende Kommando. +*/ + +void ec_command_clear(ec_command_t *cmd) +{ + ec_command_init(cmd); +} + +/*****************************************************************************/ + +#define EC_FUNC_HEADER \ + ec_command_init(cmd) + +#define EC_FUNC_WRITE_FOOTER \ + cmd->data_length = length; \ + memcpy(cmd->data, data, length); + +#define EC_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 ec_command_read(ec_command_t *cmd, unsigned short node_address, + unsigned short offset, unsigned int length) +{ + if (unlikely(node_address == 0x0000)) + printk(KERN_WARNING "EtherCAT: Warning - Using node address 0x0000!\n"); + + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_NPRD; + cmd->address.phy.dev.node = node_address; + cmd->address.phy.mem = offset; + + EC_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 ec_command_write(ec_command_t *cmd, unsigned short node_address, + unsigned short offset, unsigned int length, + const unsigned char *data) +{ + if (unlikely(node_address == 0x0000)) + printk(KERN_WARNING "EtherCAT: Warning - Using node address 0x0000!\n"); + + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_NPWR; + cmd->address.phy.dev.node = node_address; + cmd->address.phy.mem = offset; + + EC_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 ec_command_position_read(ec_command_t *cmd, short ring_position, + unsigned short offset, unsigned int length) +{ + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_APRD; + cmd->address.phy.dev.pos = ring_position; + cmd->address.phy.mem = offset; + + EC_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 ec_command_position_write(ec_command_t *cmd, short ring_position, + unsigned short offset, unsigned int length, + const unsigned char *data) +{ + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_APWR; + cmd->address.phy.dev.pos = ring_position; + cmd->address.phy.mem = offset; + + EC_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 ec_command_broadcast_read(ec_command_t *cmd, unsigned short offset, + unsigned int length) +{ + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_BRD; + cmd->address.phy.dev.node = 0x0000; + cmd->address.phy.mem = offset; + + EC_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 ec_command_broadcast_write(ec_command_t *cmd, unsigned short offset, + unsigned int length, const unsigned char *data) +{ + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_BWR; + cmd->address.phy.dev.node = 0x0000; + cmd->address.phy.mem = offset; + + EC_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 ec_command_logical_read_write(ec_command_t *cmd, unsigned int offset, + unsigned int length, unsigned char *data) +{ + EC_FUNC_HEADER; + + cmd->type = EC_COMMAND_LRW; + cmd->address.logical = offset; + + EC_FUNC_WRITE_FOOTER; +} + +/*****************************************************************************/