--- a/master/master.c Wed Mar 15 20:19:05 2006 +0000
+++ b/master/master.c Fri Mar 17 14:21:35 2006 +0000
@@ -14,8 +14,7 @@
#include <linux/slab.h>
#include <linux/delay.h>
-#include "../include/EtherCAT_rt.h"
-#include "../include/EtherCAT_si.h"
+#include "../include/ecrt.h"
#include "globals.h"
#include "master.h"
#include "slave.h"
@@ -372,24 +371,27 @@
do
{
ec_master_queue_command(master, command);
- EtherCAT_rt_master_xio(master);
+ ecrt_master_sync_io(master);
if (command->state == EC_CMD_RECEIVED) {
break;
}
else if (command->state == EC_CMD_TIMEOUT) {
- EC_ERR("Simple IO TIMED OUT!\n");
+ EC_ERR("Simple-IO TIMEOUT!\n");
return -1;
}
else if (command->state == EC_CMD_ERROR) {
- EC_ERR("Simple IO command error!\n");
+ EC_ERR("Simple-IO command error!\n");
return -1;
}
+
+ // Keine direkte Antwort. Dem Slave Zeit lassen...
+ udelay(10);
}
while (unlikely(!command->working_counter && --response_tries_left));
if (unlikely(!response_tries_left)) {
- EC_ERR("No response in simple IO!\n");
+ EC_ERR("No response in simple-IO!\n");
return -1;
}
@@ -653,18 +655,12 @@
*****************************************************************************/
/**
- Registriert eine neue Domäne.
+ Erstellt eine neue Domäne.
\return Zeiger auf die Domäne bei Erfolg, sonst NULL.
*/
-ec_domain_t *EtherCAT_rt_master_register_domain(ec_master_t *master,
- /**< Domäne */
- ec_domain_mode_t mode,
- /**< Modus */
- unsigned int timeout_us
- /**< Timeout */
- )
+ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< Master */)
{
ec_domain_t *domain;
@@ -673,8 +669,7 @@
return NULL;
}
- ec_domain_init(domain, master, mode, timeout_us);
-
+ ec_domain_init(domain, master);
list_add_tail(&domain->list, &master->domains);
return domain;
@@ -692,7 +687,7 @@
\return 0 bei Erfolg, sonst < 0
*/
-int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
+int ecrt_master_activate(ec_master_t *master /**< EtherCAT-Master */)
{
unsigned int i, j;
ec_slave_t *slave;
@@ -817,11 +812,9 @@
/**
Setzt alle Slaves zurück in den Init-Zustand.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-int EtherCAT_rt_master_deactivate(ec_master_t *master /**< EtherCAT-Master */)
+*/
+
+void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT-Master */)
{
ec_slave_t *slave;
unsigned int i;
@@ -829,26 +822,18 @@
for (i = 0; i < master->slave_count; i++)
{
slave = master->slaves + i;
-
- // CRC-Zählerstände ausgeben
ec_slave_check_crc(slave);
-
- if (unlikely(ec_slave_state_change(slave, EC_SLAVE_STATE_INIT) != 0))
- return -1;
- }
-
- return 0;
-}
-
-/*****************************************************************************/
-
-/**
- Sendet und empfängt Kommandos.
-
- \return 0 bei Erfolg, sonst < 0
-*/
-
-void EtherCAT_rt_master_xio(ec_master_t *master)
+ ec_slave_state_change(slave, EC_SLAVE_STATE_INIT);
+ }
+}
+
+/*****************************************************************************/
+
+/**
+ Sendet und empfängt Kommandos synchron.
+*/
+
+void ecrt_master_sync_io(ec_master_t *master)
{
ec_command_t *command, *next;
unsigned int commands_sent;
@@ -912,6 +897,69 @@
/*****************************************************************************/
/**
+ Sendet Kommandos asynchron.
+*/
+
+void ecrt_master_async_send(ec_master_t *master)
+{
+ ec_command_t *command, *next;
+
+ ec_master_output_stats(master);
+
+ if (unlikely(!master->device->link_state)) {
+ // Link DOWN, keines der Kommandos kann gesendet werden.
+ list_for_each_entry_safe(command, next, &master->commands, list) {
+ command->state = EC_CMD_ERROR;
+ list_del_init(&command->list);
+ }
+
+ // Device-Zustand abfragen
+ ec_device_call_isr(master->device);
+ return;
+ }
+
+ // Rahmen senden
+ ec_master_send_commands(master);
+}
+
+/*****************************************************************************/
+
+/**
+ Empfängt Kommandos asynchron.
+*/
+
+void ecrt_master_async_receive(ec_master_t *master)
+{
+ ec_command_t *command, *next;
+
+ ec_master_output_stats(master);
+
+ ec_device_call_isr(master->device);
+
+ // Alle empfangenen Kommandos aus der Liste entfernen
+ list_for_each_entry_safe(command, next, &master->commands, list)
+ if (command->state == EC_CMD_RECEIVED)
+ list_del_init(&command->list);
+
+ // Alle verbleibenden Kommandos entfernen.
+ list_for_each_entry_safe(command, next, &master->commands, list) {
+ switch (command->state) {
+ case EC_CMD_SENT:
+ case EC_CMD_QUEUED:
+ command->state = EC_CMD_TIMEOUT;
+ master->stats.timeouts++;
+ ec_master_output_stats(master);
+ break;
+ default:
+ break;
+ }
+ list_del_init(&command->list);
+ }
+}
+
+/*****************************************************************************/
+
+/**
Setzt die Debug-Ebene des Masters.
Folgende Debug-Level sind definiert:
@@ -920,11 +968,9 @@
- 2: Komplette Frame-Inhalte
*/
-void EtherCAT_rt_master_debug(ec_master_t *master,
- /**< EtherCAT-Master */
- int level
- /**< Debug-Level */
- )
+void ecrt_master_debug(ec_master_t *master, /**< EtherCAT-Master */
+ int level /**< Debug-Level */
+ )
{
if (level != master->debug_level) {
master->debug_level = level;
@@ -938,9 +984,7 @@
Gibt alle Informationen zum Master aus.
*/
-void EtherCAT_rt_master_print(const ec_master_t *master
- /**< EtherCAT-Master */
- )
+void ecrt_master_print(const ec_master_t *master /**< EtherCAT-Master */)
{
unsigned int i;
@@ -952,12 +996,14 @@
/*****************************************************************************/
-EXPORT_SYMBOL(EtherCAT_rt_master_register_domain);
-EXPORT_SYMBOL(EtherCAT_rt_master_activate);
-EXPORT_SYMBOL(EtherCAT_rt_master_deactivate);
-EXPORT_SYMBOL(EtherCAT_rt_master_xio);
-EXPORT_SYMBOL(EtherCAT_rt_master_debug);
-EXPORT_SYMBOL(EtherCAT_rt_master_print);
+EXPORT_SYMBOL(ecrt_master_create_domain);
+EXPORT_SYMBOL(ecrt_master_activate);
+EXPORT_SYMBOL(ecrt_master_deactivate);
+EXPORT_SYMBOL(ecrt_master_sync_io);
+EXPORT_SYMBOL(ecrt_master_async_send);
+EXPORT_SYMBOL(ecrt_master_async_receive);
+EXPORT_SYMBOL(ecrt_master_debug);
+EXPORT_SYMBOL(ecrt_master_print);
/*****************************************************************************/