drivers/ec_slave.c
changeset 54 7506e67dd122
parent 53 6b3b8acb71b5
child 55 059a9e712aa7
equal deleted inserted replaced
53:6b3b8acb71b5 54:7506e67dd122
     1 /******************************************************************************
       
     2  *
       
     3  *  e c _ s l a v e . c
       
     4  *
       
     5  *  Methoden für einen EtherCAT-Slave.
       
     6  *
       
     7  *  $Id$
       
     8  *
       
     9  *****************************************************************************/
       
    10 
       
    11 #include <linux/module.h>
       
    12 
       
    13 #include "ec_globals.h"
       
    14 #include "ec_slave.h"
       
    15 
       
    16 /*****************************************************************************/
       
    17 
       
    18 /**
       
    19    EtherCAT-Slave-Konstruktor.
       
    20 
       
    21    Initialisiert einen EtherCAT-Slave.
       
    22 
       
    23    ACHTUNG! Dieser Konstruktor wird quasi nie aufgerufen. Bitte immer das
       
    24    Makro ECAT_INIT_SLAVE() in ec_slave.h anpassen!
       
    25 
       
    26    @param slave Zeiger auf den zu initialisierenden Slave
       
    27 */
       
    28 
       
    29 void EtherCAT_slave_init(EtherCAT_slave_t *slave)
       
    30 {
       
    31   slave->type = 0;
       
    32   slave->revision = 0;
       
    33   slave->build = 0;
       
    34   slave->ring_position = 0;
       
    35   slave->station_address = 0;
       
    36   slave->vendor_id = 0;
       
    37   slave->product_code = 0;
       
    38   slave->revision_number = 0;
       
    39   slave->serial_number = 0;
       
    40   slave->desc = NULL;
       
    41   slave->logical_address = 0;
       
    42   slave->current_state = ECAT_STATE_UNKNOWN;
       
    43   slave->requested_state = ECAT_STATE_UNKNOWN;
       
    44   slave->process_data = NULL;
       
    45   slave->domain = 0;
       
    46   slave->error_reported = 0;
       
    47 }
       
    48 
       
    49 /*****************************************************************************/
       
    50 
       
    51 /**
       
    52    Liest einen bestimmten Kanal des Slaves als Integer-Wert.
       
    53 
       
    54    Prüft zuerst, ob der entsprechende Slave eine
       
    55    bekannte Beschreibung besitzt, ob dort eine
       
    56    read()-Funktion hinterlegt ist und ob die angegebene
       
    57    Kanalnummer gültig ist. Wenn ja, wird der dekodierte
       
    58    Wert zurückgegeben, sonst ist der Wert 0.
       
    59 
       
    60    @param slave EtherCAT-Slave
       
    61    @param channel Kanalnummer
       
    62 
       
    63    @return Gelesener Wert bzw. 0
       
    64 */
       
    65 
       
    66 int EtherCAT_read_value(EtherCAT_slave_t *slave,
       
    67                         unsigned int channel)
       
    68 {
       
    69   if (unlikely(!slave->desc)) {
       
    70     if (likely(slave->error_reported)) {
       
    71       printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
       
    72              " - Slave has no description.\n",
       
    73              slave->station_address, (unsigned int) slave);
       
    74       slave->error_reported = 1;
       
    75     }
       
    76     return 0;
       
    77   }
       
    78 
       
    79   if (unlikely(!slave->desc->read)) {
       
    80     if (likely(slave->error_reported)) {
       
    81       printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)"
       
    82              " - Slave type (%s %s) has no read method.\n",
       
    83              slave->station_address, (unsigned int) slave,
       
    84              slave->desc->vendor_name, slave->desc->product_name);
       
    85       slave->error_reported = 1;
       
    86     }
       
    87     return 0;
       
    88   }
       
    89 
       
    90   if (unlikely(channel >= slave->desc->channel_count)) {
       
    91     if (likely(slave->error_reported)) {
       
    92       printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
       
    93              " - Type (%s %s) has no channel %i.\n",
       
    94              slave->station_address, (unsigned int) slave,
       
    95              slave->desc->vendor_name, slave->desc->product_name,
       
    96              channel);
       
    97       slave->error_reported = 1;
       
    98     }
       
    99     return 0;
       
   100   }
       
   101 
       
   102   if (unlikely(!slave->process_data)) {
       
   103     if (likely(slave->error_reported)) {
       
   104       printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)"
       
   105              " - Slave does not belong to any process data object!\n",
       
   106              slave->station_address, (unsigned int) slave);
       
   107       slave->error_reported = 1;
       
   108     }
       
   109     return 0;
       
   110   }
       
   111 
       
   112   if (unlikely(slave->error_reported))
       
   113     slave->error_reported = 0;
       
   114 
       
   115   return slave->desc->read(slave->process_data, channel);
       
   116 }
       
   117 
       
   118 /*****************************************************************************/
       
   119 
       
   120 /**
       
   121    Schreibt einen bestimmten Kanal des Slaves als Integer-Wert .
       
   122 
       
   123    Prüft zuerst, ob der entsprechende Slave eine
       
   124    bekannte Beschreibung besitzt, ob dort eine
       
   125    write()-Funktion hinterlegt ist und ob die angegebene
       
   126    Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend
       
   127    kodiert und geschrieben.
       
   128 
       
   129    @param slave EtherCAT-Slave
       
   130    @param channel Kanalnummer
       
   131    @param value Zu schreibender Wert
       
   132 */
       
   133 
       
   134 void EtherCAT_write_value(EtherCAT_slave_t *slave,
       
   135                           unsigned int channel,
       
   136                           int value)
       
   137 {
       
   138   if (unlikely(!slave->desc)) {
       
   139     if (likely(slave->error_reported)) {
       
   140       printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
       
   141              " - Slave has no description.\n",
       
   142              slave->station_address, (unsigned int) slave);
       
   143       slave->error_reported = 1;
       
   144     }
       
   145     return;
       
   146   }
       
   147 
       
   148   if (unlikely(!slave->desc->write)) {
       
   149     if (likely(slave->error_reported)) {
       
   150       printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)"
       
   151              " - Type (%s %s) has no write method.\n",
       
   152              slave->station_address, (unsigned int) slave,
       
   153              slave->desc->vendor_name, slave->desc->product_name);
       
   154       slave->error_reported = 1;
       
   155     }
       
   156     return;
       
   157   }
       
   158 
       
   159   if (unlikely(channel >= slave->desc->channel_count)) {
       
   160     if (likely(slave->error_reported)) {
       
   161       printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
       
   162              " - Type (%s %s) has no channel %i.\n",
       
   163              slave->station_address, (unsigned int) slave,
       
   164              slave->desc->vendor_name, slave->desc->product_name,
       
   165              channel);
       
   166       slave->error_reported = 1;
       
   167     }
       
   168     return;
       
   169   }
       
   170 
       
   171   if (unlikely(!slave->process_data)) {
       
   172     if (likely(slave->error_reported)) {
       
   173       printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)"
       
   174              " - Slave does not belong to any process data object!\n",
       
   175              slave->station_address, (unsigned int) slave);
       
   176       slave->error_reported = 1;
       
   177     }
       
   178     return;
       
   179   }
       
   180 
       
   181   if (unlikely(slave->error_reported))
       
   182     slave->error_reported = 0;
       
   183 
       
   184   slave->desc->write(slave->process_data, channel, value);
       
   185 }
       
   186 
       
   187 /*****************************************************************************/
       
   188 
       
   189 EXPORT_SYMBOL(EtherCAT_write_value);
       
   190 EXPORT_SYMBOL(EtherCAT_read_value);
       
   191 
       
   192 /*****************************************************************************/
       
   193 
       
   194 /* Emacs-Konfiguration
       
   195 ;;; Local Variables: ***
       
   196 ;;; c-basic-offset:2 ***
       
   197 ;;; End: ***
       
   198 */