diff -r e6264685dd7b -r f564d0929292 master/command.c --- /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 +#include + +#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: *** +*/