diff -r 920e3b41a61f -r db0742533c10 drivers/ec_command.c --- 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 #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; +} + +/***************************************************************/