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