Skip to content
Snippets Groups Projects
Commit 951c5671 authored by Florian Pose's avatar Florian Pose
Browse files

Bugfix: Absturz behoben, EEPROM-Infos.

parent 601280bd
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* s l a v e . c * s l a v e . c
* *
* Methoden fr einen EtherCAT-Slave. * Methoden fr einen EtherCAT-Slave.
* *
* $Id$ * $Id$
* *
...@@ -53,7 +53,10 @@ void ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */ ...@@ -53,7 +53,10 @@ void ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
slave->registered = 0; slave->registered = 0;
slave->fmmu_count = 0; slave->fmmu_count = 0;
INIT_LIST_HEAD(&slave->cat_strings); INIT_LIST_HEAD(&slave->eeprom_strings);
slave->eeprom_name = NULL;
slave->eeprom_group = NULL;
slave->eeprom_desc = NULL;
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -67,16 +70,20 @@ void ec_slave_clear(ec_slave_t *slave /**< EtherCAT-Slave */) ...@@ -67,16 +70,20 @@ void ec_slave_clear(ec_slave_t *slave /**< EtherCAT-Slave */)
ec_slave_string_t *string, *next; ec_slave_string_t *string, *next;
// Alle Strings freigeben // Alle Strings freigeben
list_for_each_entry_safe(string, next, &slave->cat_strings, list) { list_for_each_entry_safe(string, next, &slave->eeprom_strings, list) {
list_del(&string->list); list_del(&string->list);
kfree(string); kfree(string);
} }
if (slave->eeprom_name) kfree(slave->eeprom_name);
if (slave->eeprom_group) kfree(slave->eeprom_group);
if (slave->eeprom_desc) kfree(slave->eeprom_desc);
} }
/*****************************************************************************/ /*****************************************************************************/
/** /**
Liest alle bentigten Informationen aus einem Slave. Liest alle bentigten Informationen aus einem Slave.
\return 0 wenn alles ok, < 0 bei Fehler. \return 0 wenn alles ok, < 0 bei Fehler.
*/ */
...@@ -154,7 +161,7 @@ int ec_slave_sii_read(ec_slave_t *slave, ...@@ -154,7 +161,7 @@ int ec_slave_sii_read(ec_slave_t *slave,
uint16_t offset, uint16_t offset,
/**< Adresse des zu lesenden SII-Registers */ /**< Adresse des zu lesenden SII-Registers */
uint32_t *target uint32_t *target
/**< Zeiger auf einen 4 Byte groen Speicher zum Ablegen /**< Zeiger auf einen 4 Byte groen Speicher zum Ablegen
der Daten */ der Daten */
) )
{ {
...@@ -175,7 +182,7 @@ int ec_slave_sii_read(ec_slave_t *slave, ...@@ -175,7 +182,7 @@ int ec_slave_sii_read(ec_slave_t *slave,
} }
// Der Slave legt die Informationen des Slave-Information-Interface // Der Slave legt die Informationen des Slave-Information-Interface
// in das Datenregister und lscht daraufhin ein Busy-Bit. Solange // in das Datenregister und lscht daraufhin ein Busy-Bit. Solange
// den Status auslesen, bis das Bit weg ist. // den Status auslesen, bis das Bit weg ist.
start = get_cycles(); start = get_cycles();
...@@ -244,7 +251,7 @@ int ec_slave_sii_write(ec_slave_t *slave, ...@@ -244,7 +251,7 @@ int ec_slave_sii_write(ec_slave_t *slave,
} }
// Der Slave legt die Informationen des Slave-Information-Interface // Der Slave legt die Informationen des Slave-Information-Interface
// in das Datenregister und lscht daraufhin ein Busy-Bit. Solange // in das Datenregister und lscht daraufhin ein Busy-Bit. Solange
// den Status auslesen, bis das Bit weg ist. // den Status auslesen, bis das Bit weg ist.
start = get_cycles(); start = get_cycles();
...@@ -399,17 +406,18 @@ int ec_slave_fetch_strings(ec_slave_t *slave, /**< EtherCAT-Slave */ ...@@ -399,17 +406,18 @@ int ec_slave_fetch_strings(ec_slave_t *slave, /**< EtherCAT-Slave */
offset = 1; offset = 1;
for (i = 0; i < string_count; i++) { for (i = 0; i < string_count; i++) {
size = data[offset]; size = data[offset];
// Speicher fr String-Objekt und Daten in einem Rutsch allozieren // Speicher fr String-Objekt und Daten in einem Rutsch allozieren
if (!(string = (ec_slave_string_t *) kmalloc(sizeof(ec_slave_string_t) if (!(string = (ec_slave_string_t *) kmalloc(sizeof(ec_slave_string_t)
+ size + 1, + size + 1,
GFP_KERNEL))) { GFP_KERNEL))) {
EC_ERR("Failed to allocate string memory.\n"); EC_ERR("Failed to allocate string memory.\n");
return -1; return -1;
} }
string->data = (char *) (string + sizeof(ec_slave_string_t)); string->size = size;
string->data = (char *) string + sizeof(ec_slave_string_t);
memcpy(string->data, data + offset + 1, size); memcpy(string->data, data + offset + 1, size);
string->data[size] = 0x00; string->data[size] = 0x00;
list_add_tail(&string->list, &slave->cat_strings); list_add_tail(&string->list, &slave->eeprom_strings);
offset += 1 + size; offset += 1 + size;
} }
...@@ -479,13 +487,13 @@ void ec_slave_fetch_rxpdo(ec_slave_t *slave, /**< EtherCAT-Slave */ ...@@ -479,13 +487,13 @@ void ec_slave_fetch_rxpdo(ec_slave_t *slave, /**< EtherCAT-Slave */
/*****************************************************************************/ /*****************************************************************************/
/** /**
Besttigt einen Fehler beim Zustandswechsel. Besttigt einen Fehler beim Zustandswechsel.
\todo Funktioniert noch nicht... \todo Funktioniert noch nicht...
*/ */
void ec_slave_state_ack(ec_slave_t *slave, void ec_slave_state_ack(ec_slave_t *slave,
/**< Slave, dessen Zustand gendert werden soll */ /**< Slave, dessen Zustand gendert werden soll */
uint8_t state uint8_t state
/**< Alter Zustand */ /**< Alter Zustand */
) )
...@@ -543,13 +551,13 @@ void ec_slave_state_ack(ec_slave_t *slave, ...@@ -543,13 +551,13 @@ void ec_slave_state_ack(ec_slave_t *slave,
/*****************************************************************************/ /*****************************************************************************/
/** /**
ndert den Zustand eines Slaves. ndert den Zustand eines Slaves.
\return 0 bei Erfolg, sonst < 0 \return 0 bei Erfolg, sonst < 0
*/ */
int ec_slave_state_change(ec_slave_t *slave, int ec_slave_state_change(ec_slave_t *slave,
/**< Slave, dessen Zustand gendert werden soll */ /**< Slave, dessen Zustand gendert werden soll */
uint8_t state uint8_t state
/**< Neuer Zustand */ /**< Neuer Zustand */
) )
...@@ -610,17 +618,17 @@ int ec_slave_state_change(ec_slave_t *slave, ...@@ -610,17 +618,17 @@ int ec_slave_state_change(ec_slave_t *slave,
Merkt eine FMMU-Konfiguration vor. Merkt eine FMMU-Konfiguration vor.
Die FMMU wird so konfiguriert, dass sie den gesamten Datenbereich des Die FMMU wird so konfiguriert, dass sie den gesamten Datenbereich des
entsprechenden Sync-Managers abdeckt. Fr jede Domne werden separate entsprechenden Sync-Managers abdeckt. Fr jede Domne werden separate
FMMUs konfiguriert. FMMUs konfiguriert.
Wenn die entsprechende FMMU bereits konfiguriert ist, wird dies als Wenn die entsprechende FMMU bereits konfiguriert ist, wird dies als
Erfolg zurckgegeben. Erfolg zurckgegeben.
\return 0 bei Erfolg, sonst < 0 \return 0 bei Erfolg, sonst < 0
*/ */
int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */ int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */
const ec_domain_t *domain, /**< Domne */ const ec_domain_t *domain, /**< Domne */
const ec_sync_t *sync /**< Sync-Manager */ const ec_sync_t *sync /**< Sync-Manager */
) )
{ {
...@@ -650,13 +658,11 @@ int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */ ...@@ -650,13 +658,11 @@ int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */
/*****************************************************************************/ /*****************************************************************************/
/** /**
Gibt alle Informationen ber einen EtherCAT-Slave aus. Gibt alle Informationen ber einen EtherCAT-Slave aus.
*/ */
void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */) void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */)
{ {
ec_slave_string_t *string;
EC_INFO("--- EtherCAT slave information ---\n"); EC_INFO("--- EtherCAT slave information ---\n");
if (slave->type) { if (slave->type) {
...@@ -677,24 +683,25 @@ void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */) ...@@ -677,24 +683,25 @@ void ec_slave_print(const ec_slave_t *slave /**< EtherCAT-Slave */)
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); slave->base_fmmu_count, slave->base_sync_count);
EC_INFO(" Slave information interface:\n"); EC_INFO(" EEPROM data:\n");
EC_INFO(" Configured station alias: 0x%04X (%i)\n", slave->sii_alias, EC_INFO(" Configured station alias: 0x%04X (%i)\n", slave->sii_alias,
slave->sii_alias); slave->sii_alias);
EC_INFO(" Vendor-ID: 0x%08X, Product code: 0x%08X\n", EC_INFO(" Vendor-ID: 0x%08X, Product code: 0x%08X\n",
slave->sii_vendor_id, slave->sii_product_code); 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); slave->sii_revision_number, slave->sii_serial_number);
if (slave->eeprom_name)
EC_INFO(" EEPROM strings:\n"); EC_INFO(" Name: %s\n", slave->eeprom_name);
list_for_each_entry(string, &slave->cat_strings, list) { if (slave->eeprom_group)
EC_INFO(" * \"%s\"\n", string->data); EC_INFO(" Group: %s\n", slave->eeprom_group);
} if (slave->eeprom_desc)
EC_INFO(" Description: %s\n", slave->eeprom_desc);
} }
/*****************************************************************************/ /*****************************************************************************/
/** /**
Gibt die Zhlerstnde der CRC-Fault-Counter aus und setzt diese zurck. Gibt die Zhlerstnde der CRC-Fault-Counter aus und setzt diese zurck.
\return 0 bei Erfolg, sonst < 0 \return 0 bei Erfolg, sonst < 0
*/ */
......
...@@ -58,6 +58,7 @@ ec_fmmu_t; ...@@ -58,6 +58,7 @@ ec_fmmu_t;
typedef struct typedef struct
{ {
struct list_head list; struct list_head list;
size_t size;
char *data; char *data;
} }
ec_slave_string_t; ec_slave_string_t;
...@@ -98,7 +99,11 @@ struct ec_slave ...@@ -98,7 +99,11 @@ struct ec_slave
ec_fmmu_t fmmus[EC_MAX_FMMUS]; /**< FMMU-Konfigurationen */ ec_fmmu_t fmmus[EC_MAX_FMMUS]; /**< FMMU-Konfigurationen */
uint8_t fmmu_count; /**< Wieviele FMMUs schon benutzt sind. */ uint8_t fmmu_count; /**< Wieviele FMMUs schon benutzt sind. */
struct list_head cat_strings; /**< Strings im EEPROM */ struct list_head eeprom_strings; /**< Strings im EEPROM */
const char *eeprom_name; /**< Slave-Name laut Hersteller */
const char *eeprom_group; /**< Slave-Beschreibung laut Hersteller */
const char *eeprom_desc; /**< Slave-Beschreibung laut Hersteller */
}; };
/*****************************************************************************/ /*****************************************************************************/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment