fp@39: /****************************************************************************** fp@0: * fp@54: * s l a v e . c fp@0: * fp@0: * Methoden für einen EtherCAT-Slave. fp@0: * fp@39: * $Id$ fp@0: * fp@39: *****************************************************************************/ fp@0: fp@24: #include fp@0: fp@54: #include "globals.h" fp@54: #include "slave.h" fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Slave-Konstruktor. fp@0: fp@0: Initialisiert einen EtherCAT-Slave. fp@0: fp@42: ACHTUNG! Dieser Konstruktor wird quasi nie aufgerufen. Bitte immer das fp@42: Makro ECAT_INIT_SLAVE() in ec_slave.h anpassen! fp@42: fp@0: @param slave Zeiger auf den zu initialisierenden Slave fp@0: */ fp@0: fp@54: void ec_slave_init(ec_slave_t *slave) fp@0: { fp@0: slave->type = 0; fp@0: slave->revision = 0; fp@0: slave->build = 0; fp@0: slave->ring_position = 0; fp@0: slave->station_address = 0; fp@0: slave->vendor_id = 0; fp@0: slave->product_code = 0; fp@0: slave->revision_number = 0; fp@5: slave->serial_number = 0; fp@39: slave->desc = NULL; fp@42: slave->logical_address = 0; fp@54: slave->current_state = EC_SLAVE_STATE_UNKNOWN; fp@54: slave->requested_state = EC_SLAVE_STATE_UNKNOWN; fp@42: slave->process_data = NULL; fp@42: slave->domain = 0; fp@39: slave->error_reported = 0; fp@0: } fp@0: fp@39: /*****************************************************************************/ fp@0: fp@54: #if 0 fp@0: /** fp@0: Liest einen bestimmten Kanal des Slaves als Integer-Wert. fp@0: fp@0: Prüft zuerst, ob der entsprechende Slave eine fp@0: bekannte Beschreibung besitzt, ob dort eine fp@0: read()-Funktion hinterlegt ist und ob die angegebene fp@0: Kanalnummer gültig ist. Wenn ja, wird der dekodierte fp@0: Wert zurückgegeben, sonst ist der Wert 0. fp@0: fp@0: @param slave EtherCAT-Slave fp@0: @param channel Kanalnummer fp@0: fp@0: @return Gelesener Wert bzw. 0 fp@0: */ fp@0: fp@0: int EtherCAT_read_value(EtherCAT_slave_t *slave, fp@0: unsigned int channel) fp@0: { fp@39: if (unlikely(!slave->desc)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" fp@39: " - Slave has no description.\n", fp@39: slave->station_address, (unsigned int) slave); fp@39: slave->error_reported = 1; fp@39: } fp@0: return 0; fp@0: } fp@0: fp@39: if (unlikely(!slave->desc->read)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" fp@39: " - Slave type (%s %s) has no read method.\n", fp@39: slave->station_address, (unsigned int) slave, fp@39: slave->desc->vendor_name, slave->desc->product_name); fp@39: slave->error_reported = 1; fp@39: } fp@0: return 0; fp@0: } fp@0: fp@42: if (unlikely(channel >= slave->desc->channel_count)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" fp@39: " - Type (%s %s) has no channel %i.\n", fp@39: slave->station_address, (unsigned int) slave, fp@39: slave->desc->vendor_name, slave->desc->product_name, fp@39: channel); fp@39: slave->error_reported = 1; fp@39: } fp@0: return 0; fp@0: } fp@0: fp@42: if (unlikely(!slave->process_data)) { fp@42: if (likely(slave->error_reported)) { fp@42: printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" fp@42: " - Slave does not belong to any process data object!\n", fp@42: slave->station_address, (unsigned int) slave); fp@42: slave->error_reported = 1; fp@42: } fp@42: return 0; fp@42: } fp@42: fp@39: if (unlikely(slave->error_reported)) fp@39: slave->error_reported = 0; fp@39: fp@0: return slave->desc->read(slave->process_data, channel); fp@0: } fp@0: fp@39: /*****************************************************************************/ fp@0: fp@0: /** fp@0: Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . fp@0: fp@0: Prüft zuerst, ob der entsprechende Slave eine fp@0: bekannte Beschreibung besitzt, ob dort eine fp@0: write()-Funktion hinterlegt ist und ob die angegebene fp@0: Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend fp@0: kodiert und geschrieben. fp@0: fp@0: @param slave EtherCAT-Slave fp@0: @param channel Kanalnummer fp@0: @param value Zu schreibender Wert fp@0: */ fp@0: fp@0: void EtherCAT_write_value(EtherCAT_slave_t *slave, fp@0: unsigned int channel, fp@0: int value) fp@0: { fp@39: if (unlikely(!slave->desc)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" fp@39: " - Slave has no description.\n", fp@39: slave->station_address, (unsigned int) slave); fp@39: slave->error_reported = 1; fp@39: } fp@0: return; fp@0: } fp@0: fp@39: if (unlikely(!slave->desc->write)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" fp@39: " - Type (%s %s) has no write method.\n", fp@39: slave->station_address, (unsigned int) slave, fp@39: slave->desc->vendor_name, slave->desc->product_name); fp@39: slave->error_reported = 1; fp@39: } fp@0: return; fp@0: } fp@0: fp@42: if (unlikely(channel >= slave->desc->channel_count)) { fp@39: if (likely(slave->error_reported)) { fp@39: printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" fp@39: " - Type (%s %s) has no channel %i.\n", fp@39: slave->station_address, (unsigned int) slave, fp@39: slave->desc->vendor_name, slave->desc->product_name, fp@39: channel); fp@39: slave->error_reported = 1; fp@39: } fp@0: return; fp@0: } fp@0: fp@42: if (unlikely(!slave->process_data)) { fp@42: if (likely(slave->error_reported)) { fp@42: printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" fp@42: " - Slave does not belong to any process data object!\n", fp@42: slave->station_address, (unsigned int) slave); fp@42: slave->error_reported = 1; fp@42: } fp@42: return; fp@42: } fp@42: fp@39: if (unlikely(slave->error_reported)) fp@39: slave->error_reported = 0; fp@39: fp@0: slave->desc->write(slave->process_data, channel, value); fp@0: } fp@0: fp@39: /*****************************************************************************/ fp@24: fp@23: EXPORT_SYMBOL(EtherCAT_write_value); fp@24: EXPORT_SYMBOL(EtherCAT_read_value); fp@54: #endif fp@39: fp@39: /*****************************************************************************/ fp@42: fp@42: /* Emacs-Konfiguration fp@42: ;;; Local Variables: *** fp@42: ;;; c-basic-offset:2 *** fp@42: ;;; End: *** fp@42: */