drivers/ec_slave.c
changeset 0 05c992bf5847
child 2 b0a7a4745bf9
equal deleted inserted replaced
-1:000000000000 0:05c992bf5847
       
     1 /****************************************************************
       
     2  *
       
     3  *  e c _ s l a v e . c
       
     4  *
       
     5  *  Methoden für einen EtherCAT-Slave.
       
     6  *
       
     7  *  $Date$
       
     8  *  $Author$
       
     9  *
       
    10  ***************************************************************/
       
    11 
       
    12 #include <linux/kernel.h>
       
    13 
       
    14 #include "ec_globals.h"
       
    15 #include "ec_slave.h"
       
    16 #include "ec_dbg.h"
       
    17 
       
    18 /***************************************************************/
       
    19 
       
    20 /**
       
    21    EtherCAT-Slave-Konstruktor.
       
    22 
       
    23    Initialisiert einen EtherCAT-Slave.
       
    24 
       
    25    @param slave Zeiger auf den zu initialisierenden Slave
       
    26 */
       
    27 
       
    28 void EtherCAT_slave_init(EtherCAT_slave_t *slave)
       
    29 {
       
    30   slave->type = 0;
       
    31   slave->revision = 0;
       
    32   slave->build = 0;
       
    33 
       
    34   slave->ring_position = 0;
       
    35   slave->station_address = 0;
       
    36 
       
    37   slave->vendor_id = 0;
       
    38   slave->product_code = 0;
       
    39   slave->revision_number = 0;
       
    40   
       
    41   slave->desc = 0;
       
    42   
       
    43   slave->logical_address0 = 0;
       
    44 
       
    45   slave->current_state = ECAT_STATE_UNKNOWN;
       
    46   slave->requested_state = ECAT_STATE_UNKNOWN;
       
    47 }
       
    48 
       
    49 /***************************************************************/
       
    50 
       
    51 /**
       
    52    EtherCAT-Slave-Destruktor.
       
    53 
       
    54    Im Moment ohne Funktionalität.
       
    55 
       
    56    @param slave Zeiger auf den zu zerstörenden Slave
       
    57 */
       
    58 
       
    59 void EtherCAT_slave_clear(EtherCAT_slave_t *slave)
       
    60 {
       
    61   // Nothing yet...
       
    62 }
       
    63 
       
    64 /***************************************************************/
       
    65 
       
    66 /**
       
    67    Liest einen bestimmten Kanal des Slaves als Integer-Wert.
       
    68 
       
    69    Prüft zuerst, ob der entsprechende Slave eine
       
    70    bekannte Beschreibung besitzt, ob dort eine
       
    71    read()-Funktion hinterlegt ist und ob die angegebene
       
    72    Kanalnummer gültig ist. Wenn ja, wird der dekodierte
       
    73    Wert zurückgegeben, sonst ist der Wert 0.
       
    74 
       
    75    @param slave EtherCAT-Slave
       
    76    @param channel Kanalnummer
       
    77 
       
    78    @return Gelesener Wert bzw. 0
       
    79 */
       
    80 
       
    81 int EtherCAT_read_value(EtherCAT_slave_t *slave,
       
    82                         unsigned int channel)
       
    83 {
       
    84   if (!slave->desc)
       
    85   {
       
    86     EC_DBG(KERN_WARNING "EtherCAT: Reading failed - "
       
    87            "Slave %04X (at %0X) has no description.\n",
       
    88            slave->station_address, (unsigned int) slave);
       
    89     return 0;
       
    90   }
       
    91 
       
    92   if (!slave->desc->read)
       
    93   {
       
    94     EC_DBG(KERN_WARNING "EtherCAT: Reading failed - "
       
    95            "Slave type (%s %s) has no read method.\n",
       
    96            slave->desc->vendor_name, slave->desc->product_name);
       
    97     return 0;
       
    98   }
       
    99 
       
   100   if (channel >= slave->desc->channels)
       
   101   {
       
   102     EC_DBG(KERN_WARNING "EtherCAT: Reading failed - "
       
   103            "Slave %4X (%s %s) has no channel %i.\n",
       
   104            slave->station_address, slave->desc->vendor_name,
       
   105            slave->desc->product_name, channel);
       
   106     return 0;
       
   107   }
       
   108 
       
   109   return slave->desc->read(slave->process_data, channel);
       
   110 }
       
   111 
       
   112 /***************************************************************/
       
   113 
       
   114 /**
       
   115    Schreibt einen bestimmten Kanal des Slaves als Integer-Wert .
       
   116 
       
   117    Prüft zuerst, ob der entsprechende Slave eine
       
   118    bekannte Beschreibung besitzt, ob dort eine
       
   119    write()-Funktion hinterlegt ist und ob die angegebene
       
   120    Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend
       
   121    kodiert und geschrieben.
       
   122 
       
   123    @param slave EtherCAT-Slave
       
   124    @param channel Kanalnummer
       
   125    @param value Zu schreibender Wert
       
   126 */
       
   127 
       
   128 void EtherCAT_write_value(EtherCAT_slave_t *slave,
       
   129                           unsigned int channel,
       
   130                           int value)
       
   131 {
       
   132   if (!slave->desc)
       
   133   {
       
   134     EC_DBG(KERN_WARNING "EtherCAT: Writing failed - "
       
   135            "Slave %04X (at %0X) has no description.\n",
       
   136            slave->station_address, (unsigned int) slave);
       
   137     return;
       
   138   }
       
   139 
       
   140   if (!slave->desc->write)
       
   141   {
       
   142     EC_DBG(KERN_WARNING "EtherCAT: Writing failed - "
       
   143            "Slave type (%s %s) has no write method.\n",
       
   144            slave->desc->vendor_name, slave->desc->product_name);
       
   145     return;
       
   146   }
       
   147 
       
   148   if (channel >= slave->desc->channels)
       
   149   {
       
   150     EC_DBG(KERN_WARNING "EtherCAT: Writing failed - "
       
   151            "Slave %4X (%s %s) has no channel %i.\n",
       
   152            slave->station_address, slave->desc->vendor_name,
       
   153            slave->desc->product_name, channel);
       
   154     return;
       
   155   }
       
   156 
       
   157   slave->desc->write(slave->process_data, channel, value);
       
   158 }
       
   159 
       
   160 /***************************************************************/