drivers/ec_slave.c
changeset 39 6965c23a6826
parent 26 60435f959e5c
child 42 a22a202d0f42
equal deleted inserted replaced
38:3213cbbd58b7 39:6965c23a6826
     1 /****************************************************************
     1 /******************************************************************************
     2  *
     2  *
     3  *  e c _ s l a v e . c
     3  *  e c _ s l a v e . c
     4  *
     4  *
     5  *  Methoden für einen EtherCAT-Slave.
     5  *  Methoden für einen EtherCAT-Slave.
     6  *
     6  *
     7  *  $Date$
     7  *  $Id$
     8  *  $Author$
       
     9  *
     8  *
    10  ***************************************************************/
     9  *****************************************************************************/
    11 
    10 
    12 #include <linux/module.h>
    11 #include <linux/module.h>
    13 
    12 
    14 #include "ec_globals.h"
    13 #include "ec_globals.h"
    15 #include "ec_slave.h"
    14 #include "ec_slave.h"
    16 
    15 
    17 /***************************************************************/
    16 /*****************************************************************************/
    18 
    17 
    19 /**
    18 /**
    20    EtherCAT-Slave-Konstruktor.
    19    EtherCAT-Slave-Konstruktor.
    21 
    20 
    22    Initialisiert einen EtherCAT-Slave.
    21    Initialisiert einen EtherCAT-Slave.
    27 void EtherCAT_slave_init(EtherCAT_slave_t *slave)
    26 void EtherCAT_slave_init(EtherCAT_slave_t *slave)
    28 {
    27 {
    29   slave->type = 0;
    28   slave->type = 0;
    30   slave->revision = 0;
    29   slave->revision = 0;
    31   slave->build = 0;
    30   slave->build = 0;
    32 
       
    33   slave->ring_position = 0;
    31   slave->ring_position = 0;
    34   slave->station_address = 0;
    32   slave->station_address = 0;
    35 
       
    36   slave->vendor_id = 0;
    33   slave->vendor_id = 0;
    37   slave->product_code = 0;
    34   slave->product_code = 0;
    38   slave->revision_number = 0;
    35   slave->revision_number = 0;
    39   slave->serial_number = 0;
    36   slave->serial_number = 0;
    40 
    37   slave->desc = NULL;
    41   slave->desc = 0;
       
    42 
       
    43   slave->logical_address0 = 0;
    38   slave->logical_address0 = 0;
    44 
       
    45   slave->current_state = ECAT_STATE_UNKNOWN;
    39   slave->current_state = ECAT_STATE_UNKNOWN;
    46   slave->requested_state = ECAT_STATE_UNKNOWN;
    40   slave->requested_state = ECAT_STATE_UNKNOWN;
       
    41   slave->error_reported = 0;
    47 }
    42 }
    48 
    43 
    49 /***************************************************************/
    44 /*****************************************************************************/
    50 
    45 
    51 /**
    46 /**
    52    EtherCAT-Slave-Destruktor.
    47    EtherCAT-Slave-Destruktor.
    53 
    48 
    54    Im Moment ohne Funktionalität.
    49    Im Moment ohne Funktionalität.
    59 void EtherCAT_slave_clear(EtherCAT_slave_t *slave)
    54 void EtherCAT_slave_clear(EtherCAT_slave_t *slave)
    60 {
    55 {
    61   // Nothing yet...
    56   // Nothing yet...
    62 }
    57 }
    63 
    58 
    64 /***************************************************************/
    59 /*****************************************************************************/
    65 
    60 
    66 /**
    61 /**
    67    Liest einen bestimmten Kanal des Slaves als Integer-Wert.
    62    Liest einen bestimmten Kanal des Slaves als Integer-Wert.
    68 
    63 
    69    Prüft zuerst, ob der entsprechende Slave eine
    64    Prüft zuerst, ob der entsprechende Slave eine
    79 */
    74 */
    80 
    75 
    81 int EtherCAT_read_value(EtherCAT_slave_t *slave,
    76 int EtherCAT_read_value(EtherCAT_slave_t *slave,
    82                         unsigned int channel)
    77                         unsigned int channel)
    83 {
    78 {
    84   if (!slave->desc)
    79   if (unlikely(!slave->desc)) {
    85   {
    80     if (likely(slave->error_reported)) {
    86     printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
    81       printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
    87            " - Slave has no description.\n",
    82              " - Slave has no description.\n",
    88            slave->station_address, (unsigned int) slave);
    83              slave->station_address, (unsigned int) slave);
       
    84       slave->error_reported = 1;
       
    85     }
    89     return 0;
    86     return 0;
    90   }
    87   }
    91 
    88 
    92   if (!slave->desc->read)
    89   if (unlikely(!slave->desc->read)) {
    93   {
    90     if (likely(slave->error_reported)) {
    94     printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
    91       printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
    95            " - Slave type (%s %s) has no read method.\n",
    92              " - Slave type (%s %s) has no read method.\n",
    96            slave->station_address, (unsigned int) slave,
    93              slave->station_address, (unsigned int) slave,
    97            slave->desc->vendor_name, slave->desc->product_name);
    94              slave->desc->vendor_name, slave->desc->product_name);
       
    95       slave->error_reported = 1;
       
    96     }
    98     return 0;
    97     return 0;
    99   }
    98   }
   100 
    99 
   101   if (channel >= slave->desc->channels)
   100   if (unlikely(channel >= slave->desc->channels)) {
   102   {
   101     if (likely(slave->error_reported)) {
   103     printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
   102       printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
   104            " - Type (%s %s) has no channel %i.\n",
   103              " - Type (%s %s) has no channel %i.\n",
   105            slave->station_address, (unsigned int) slave,
   104              slave->station_address, (unsigned int) slave,
   106            slave->desc->vendor_name, slave->desc->product_name,
   105              slave->desc->vendor_name, slave->desc->product_name,
   107            channel);
   106              channel);
       
   107       slave->error_reported = 1;
       
   108     }
   108     return 0;
   109     return 0;
   109   }
   110   }
       
   111 
       
   112   if (unlikely(slave->error_reported))
       
   113     slave->error_reported = 0;
   110 
   114 
   111   return slave->desc->read(slave->process_data, channel);
   115   return slave->desc->read(slave->process_data, channel);
   112 }
   116 }
   113 
   117 
   114 /***************************************************************/
   118 /*****************************************************************************/
   115 
   119 
   116 /**
   120 /**
   117    Schreibt einen bestimmten Kanal des Slaves als Integer-Wert .
   121    Schreibt einen bestimmten Kanal des Slaves als Integer-Wert .
   118 
   122 
   119    Prüft zuerst, ob der entsprechende Slave eine
   123    Prüft zuerst, ob der entsprechende Slave eine
   129 
   133 
   130 void EtherCAT_write_value(EtherCAT_slave_t *slave,
   134 void EtherCAT_write_value(EtherCAT_slave_t *slave,
   131                           unsigned int channel,
   135                           unsigned int channel,
   132                           int value)
   136                           int value)
   133 {
   137 {
   134   if (!slave->desc)
   138   if (unlikely(!slave->desc)) {
   135   {
   139     if (likely(slave->error_reported)) {
   136     printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
   140       printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
   137            " - Slave has no description.\n",
   141              " - Slave has no description.\n",
   138            slave->station_address, (unsigned int) slave);
   142              slave->station_address, (unsigned int) slave);
       
   143       slave->error_reported = 1;
       
   144     }
   139     return;
   145     return;
   140   }
   146   }
   141 
   147 
   142   if (!slave->desc->write)
   148   if (unlikely(!slave->desc->write)) {
   143   {
   149     if (likely(slave->error_reported)) {
   144     printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
   150       printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
   145            " - Type (%s %s) has no write method.\n",
   151              " - Type (%s %s) has no write method.\n",
   146            slave->station_address, (unsigned int) slave,
   152              slave->station_address, (unsigned int) slave,
   147            slave->desc->vendor_name, slave->desc->product_name);
   153              slave->desc->vendor_name, slave->desc->product_name);
       
   154       slave->error_reported = 1;
       
   155     }
   148     return;
   156     return;
   149   }
   157   }
   150 
   158 
   151   if (channel >= slave->desc->channels)
   159   if (unlikely(channel >= slave->desc->channels)) {
   152   {
   160     if (likely(slave->error_reported)) {
   153     printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
   161       printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
   154            " - Type (%s %s) has no channel %i.\n",
   162              " - Type (%s %s) has no channel %i.\n",
   155            slave->station_address, (unsigned int) slave,
   163              slave->station_address, (unsigned int) slave,
   156            slave->desc->vendor_name, slave->desc->product_name,
   164              slave->desc->vendor_name, slave->desc->product_name,
   157            channel);
   165              channel);
       
   166       slave->error_reported = 1;
       
   167     }
   158     return;
   168     return;
   159   }
   169   }
       
   170 
       
   171   if (unlikely(slave->error_reported))
       
   172     slave->error_reported = 0;
   160 
   173 
   161   slave->desc->write(slave->process_data, channel, value);
   174   slave->desc->write(slave->process_data, channel, value);
   162 }
   175 }
   163 
   176 
   164 /***************************************************************/
   177 /*****************************************************************************/
   165 
   178 
   166 EXPORT_SYMBOL(EtherCAT_write_value);
   179 EXPORT_SYMBOL(EtherCAT_write_value);
   167 EXPORT_SYMBOL(EtherCAT_read_value);
   180 EXPORT_SYMBOL(EtherCAT_read_value);
       
   181 
       
   182 /*****************************************************************************/