fp@0: /**************************************************************** fp@0: * fp@0: * e c _ c o m m a n d . c fp@0: * fp@0: * Methoden für ein EtherCAT-Kommando. fp@0: * fp@0: * $Date$ fp@0: * $Author$ fp@0: * fp@0: ***************************************************************/ fp@0: fp@0: #include fp@0: fp@0: #include "ec_command.h" fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: Kommando-Konstruktor. fp@0: fp@0: Initialisiert alle Variablen innerhalb des Kommandos auf die fp@0: Default-Werte. fp@13: fp@0: @param cmd Zeiger auf das zu initialisierende Kommando. fp@0: */ fp@0: fp@0: void EtherCAT_command_init(EtherCAT_command_t *cmd) fp@0: { fp@0: cmd->type = ECAT_CMD_NONE; fp@0: cmd->address.logical = 0x00000000; fp@0: cmd->data_length = 0; fp@0: cmd->state = ECAT_CS_READY; fp@0: cmd->index = 0; fp@0: cmd->working_counter = 0; fp@0: } fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: Kommando-Destruktor. fp@0: fp@2: Setzt alle Attribute auf den Anfangswert zurueck. fp@13: fp@0: @param cmd Zeiger auf das zu initialisierende Kommando. fp@0: */ fp@0: fp@0: void EtherCAT_command_clear(EtherCAT_command_t *cmd) fp@0: { fp@2: EtherCAT_command_init(cmd); fp@0: } fp@0: fp@0: /***************************************************************/ fp@13: fp@13: #define ECAT_FUNC_HEADER \ fp@13: EtherCAT_command_init(cmd) fp@13: fp@13: #define ECAT_FUNC_WRITE_FOOTER \ fp@13: cmd->data_length = length; \ fp@13: memcpy(cmd->data, data, length); fp@13: fp@13: #define ECAT_FUNC_READ_FOOTER \ fp@13: cmd->data_length = length; fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-NPRD-Kommando. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param node_address Adresse des Knotens (Slaves) fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu lesenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_read(EtherCAT_command_t *cmd, fp@13: unsigned short node_address, fp@13: unsigned short offset, fp@13: unsigned int length) fp@13: { fp@13: if (node_address == 0x0000) fp@26: printk(KERN_WARNING "EtherCAT: Using node address 0x0000!\n"); fp@13: fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_NPRD; fp@13: cmd->address.phy.dev.node = node_address; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_READ_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-NPWR-Kommando. fp@13: fp@13: Alloziert ein "node-adressed physical write"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param node_address Adresse des Knotens (Slaves) fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu schreibenden Daten fp@13: @param data Zeiger auf Speicher mit zu schreibenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_write(EtherCAT_command_t *cmd, fp@13: unsigned short node_address, fp@13: unsigned short offset, fp@13: unsigned int length, fp@13: const unsigned char *data) fp@13: { fp@13: if (node_address == 0x0000) fp@26: printk(KERN_WARNING "EtherCAT: Using node address 0x0000!\n"); fp@13: fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_NPWR; fp@13: cmd->address.phy.dev.node = node_address; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_WRITE_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-APRD-Kommando. fp@13: fp@13: Alloziert ein "autoincerement physical read"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param ring_position (Negative) Position des Slaves im Bus fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu lesenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_position_read(EtherCAT_command_t *cmd, fp@13: short ring_position, fp@13: unsigned short offset, fp@13: unsigned int length) fp@13: { fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_APRD; fp@13: cmd->address.phy.dev.pos = ring_position; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_READ_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-APWR-Kommando. fp@13: fp@13: Alloziert ein "autoincrement physical write"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param ring_position (Negative) Position des Slaves im Bus fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu schreibenden Daten fp@13: @param data Zeiger auf Speicher mit zu schreibenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_position_write(EtherCAT_command_t *cmd, fp@13: short ring_position, fp@13: unsigned short offset, fp@13: unsigned int length, fp@13: const unsigned char *data) fp@13: { fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_APWR; fp@13: cmd->address.phy.dev.pos = ring_position; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_WRITE_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-BRD-Kommando. fp@13: fp@13: Alloziert ein "broadcast read"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu lesenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_broadcast_read(EtherCAT_command_t *cmd, fp@13: unsigned short offset, fp@13: unsigned int length) fp@13: { fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_BRD; fp@13: cmd->address.phy.dev.node = 0x0000; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_READ_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-BWR-Kommando. fp@13: fp@13: Alloziert ein "broadcast write"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param offset Physikalische Speicheradresse im Slave fp@13: @param length Länge der zu schreibenden Daten fp@13: @param data Zeiger auf Speicher mit zu schreibenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_broadcast_write(EtherCAT_command_t *cmd, fp@13: unsigned short offset, fp@13: unsigned int length, fp@13: const unsigned char *data) fp@13: { fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_BWR; fp@13: cmd->address.phy.dev.node = 0x0000; fp@13: cmd->address.phy.mem = offset; fp@13: fp@13: ECAT_FUNC_WRITE_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/ fp@13: fp@13: /** fp@13: Initialisiert ein EtherCAT-LRW-Kommando. fp@13: fp@13: Alloziert ein "logical read write"-Kommando fp@13: und fügt es in die Liste des Masters ein. fp@13: fp@13: @param cmd Zeiger auf das Kommando fp@13: @param offset Logische Speicheradresse fp@13: @param length Länge der zu lesenden/schreibenden Daten fp@13: @param data Zeiger auf Speicher mit zu lesenden/schreibenden Daten fp@13: */ fp@13: fp@13: void EtherCAT_command_logical_read_write(EtherCAT_command_t *cmd, fp@13: unsigned int offset, fp@13: unsigned int length, fp@13: unsigned char *data) fp@13: { fp@13: ECAT_FUNC_HEADER; fp@13: fp@13: cmd->type = ECAT_CMD_LRW; fp@13: cmd->address.logical = offset; fp@13: fp@13: ECAT_FUNC_WRITE_FOOTER; fp@13: } fp@13: fp@13: /***************************************************************/