diff -r 132c3ffc8dea -r 4d5dc58d48e2 master/slave.c --- a/master/slave.c Tue Mar 21 15:10:18 2006 +0000 +++ b/master/slave.c Tue Mar 21 15:45:11 2006 +0000 @@ -2,7 +2,7 @@ * * s l a v e . c * - * Methoden fŽür einen EtherCAT-Slave. + * Methoden für einen EtherCAT-Slave. * * $Id$ * @@ -20,11 +20,12 @@ int ec_slave_fetch_categories(ec_slave_t *); int ec_slave_fetch_strings(ec_slave_t *, const uint8_t *); -void ec_slave_fetch_general(ec_slave_t *, const uint8_t *); +int ec_slave_fetch_general(ec_slave_t *, const uint8_t *); void ec_slave_fetch_fmmu(ec_slave_t *, const uint8_t *); void ec_slave_fetch_sync(ec_slave_t *, const uint8_t *); void ec_slave_fetch_txpdo(ec_slave_t *, const uint8_t *); void ec_slave_fetch_rxpdo(ec_slave_t *, const uint8_t *); +int ec_slave_locate_string(ec_slave_t *, unsigned int, char **); /*****************************************************************************/ @@ -161,7 +162,7 @@ uint16_t offset, /**< Adresse des zu lesenden SII-Registers */ uint32_t *target - /**< Zeiger auf einen 4 Byte groŽßen Speicher zum Ablegen + /**< Zeiger auf einen 4 Byte groÂŽßen Speicher zum Ablegen der Daten */ ) { @@ -316,8 +317,7 @@ // read category header if (ec_slave_sii_read(slave, word_offset, &value)) { EC_ERR("Unable to read category header and size.\n"); - kfree(cat_data); - return -1; + goto out_free; } // Last category? @@ -330,8 +330,7 @@ for (i = 0; i < word_count; i++) { if (ec_slave_sii_read(slave, word_offset + 2 + i, &value)) { EC_ERR("Unable to read category data word %i.\n", i); - kfree(cat_data); - return -1; + goto out_free; } cat_data[i * 2] = (value >> 0) & 0xFF; @@ -348,14 +347,13 @@ switch (header) { case 0x000A: - if (ec_slave_fetch_strings(slave, cat_data)) { - kfree(cat_data); - return -1; - } + if (ec_slave_fetch_strings(slave, cat_data)) + goto out_free; break; case 0x001E: case 0x0001: - ec_slave_fetch_general(slave, cat_data); + if (ec_slave_fetch_general(slave, cat_data)) + goto out_free; break; case 0x0028: case 0x0002: @@ -383,6 +381,10 @@ kfree(cat_data); return 0; + + out_free: + kfree(cat_data); + return -1; } /*****************************************************************************/ @@ -430,10 +432,18 @@ Holt die Daten einer General-Kategorie. */ -void ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT-Slave */ - const uint8_t *data /**< Kategorie-Daten */ - ) -{ +int ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT-Slave */ + const uint8_t *data /**< Kategorie-Daten */ + ) +{ + if (ec_slave_locate_string(slave, data[0], &slave->eeprom_group)) + return -1; + if (ec_slave_locate_string(slave, data[1], &slave->eeprom_name)) + return -1; + if (ec_slave_locate_string(slave, data[3], &slave->eeprom_desc)) + return -1; + + return 0; } /*****************************************************************************/ @@ -487,6 +497,37 @@ /*****************************************************************************/ /** + Durchsucht die temporären Strings und dupliziert den gefundenen String. +*/ + +int ec_slave_locate_string(ec_slave_t *slave, unsigned int index, char **ptr) +{ + ec_slave_string_t *string; + + if (*ptr) { + kfree(*ptr); + *ptr = NULL; + } + + if (!index) return 0; + + list_for_each_entry(string, &slave->eeprom_strings, list) { + if (!(--index)) { + if (!(*ptr = (char *) kmalloc(string->size + 1, GFP_KERNEL))) { + EC_ERR("Unable to allocate string memory.\n"); + return -1; + } + memcpy(*ptr, string->data, string->size + 1); + break; + } + } + + return 0; +} + +/*****************************************************************************/ + +/** Bestätigt einen Fehler beim Zustandswechsel. \todo Funktioniert noch nicht... @@ -663,45 +704,47 @@ void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */) { - EC_INFO("--- EtherCAT slave information ---\n"); + EC_INFO("x-- EtherCAT slave information ---------------\n"); if (slave->type) { - EC_INFO(" Vendor \"%s\", Product \"%s\": %s\n", + EC_INFO("| Vendor \"%s\", Product \"%s\": %s\n", slave->type->vendor_name, slave->type->product_name, slave->type->description); } else { - EC_INFO(" *** This slave has no type information! ***\n"); - } - - EC_INFO(" Ring position: %i, Station address: 0x%04X\n", + EC_INFO("| *** This slave has no type information! ***\n"); + } + + EC_INFO("| Ring position: %i, Station address: 0x%04X\n", slave->ring_position, slave->station_address); - EC_INFO(" Base information:\n"); - EC_INFO(" Type %u, Revision %i, Build %i\n", + EC_INFO("| Base information:\n"); + EC_INFO("| Type %u, Revision %i, Build %i\n", slave->base_type, slave->base_revision, slave->base_build); - EC_INFO(" Supported FMMUs: %i, Sync managers: %i\n", + EC_INFO("| Supported FMMUs: %i, Sync managers: %i\n", slave->base_fmmu_count, slave->base_sync_count); - EC_INFO(" EEPROM data:\n"); - EC_INFO(" Configured station alias: 0x%04X (%i)\n", slave->sii_alias, - slave->sii_alias); - EC_INFO(" Vendor-ID: 0x%08X, Product code: 0x%08X\n", + EC_INFO("| EEPROM data:\n"); + if (slave->sii_alias) + EC_INFO("| Configured station alias: 0x%04X (%i)\n", + slave->sii_alias, slave->sii_alias); + EC_INFO("| Vendor-ID: 0x%08X, Product code: 0x%08X\n", slave->sii_vendor_id, slave->sii_product_code); - EC_INFO(" Revision number: 0x%08X, Serial number: 0x%08X\n", + EC_INFO("| Revision number: 0x%08X, Serial number: 0x%08X\n", slave->sii_revision_number, slave->sii_serial_number); if (slave->eeprom_name) - EC_INFO(" Name: %s\n", slave->eeprom_name); + EC_INFO("| Name: %s\n", slave->eeprom_name); if (slave->eeprom_group) - EC_INFO(" Group: %s\n", slave->eeprom_group); + EC_INFO("| Group: %s\n", slave->eeprom_group); if (slave->eeprom_desc) - EC_INFO(" Description: %s\n", slave->eeprom_desc); -} - -/*****************************************************************************/ - -/** - Gibt die ZŽählerstände der CRC-Fault-Counter aus und setzt diese zurück. + EC_INFO("| Description: %s\n", slave->eeprom_desc); + EC_INFO("x---------------------------------------------\n"); +} + +/*****************************************************************************/ + +/** + Gibt die Zählerstände der CRC-Fault-Counter aus und setzt diese zurück. \return 0 bei Erfolg, sonst < 0 */