--- a/master/slave.c Mon Apr 03 10:03:34 2006 +0000
+++ b/master/slave.c Mon Apr 03 14:12:45 2006 +0000
@@ -43,11 +43,6 @@
slave->base_build = 0;
slave->base_fmmu_count = 0;
slave->base_sync_count = 0;
- for (i = 0; i < 2; i++) {
- slave->dl_status_link[i] = 0;
- slave->dl_status_loop[i] = 0;
- slave->dl_status_comm[i] = 0;
- }
slave->ring_position = 0;
slave->station_address = 0;
slave->sii_alias = 0;
@@ -66,10 +61,19 @@
slave->eeprom_name = NULL;
slave->eeprom_group = NULL;
slave->eeprom_desc = NULL;
+
+ ec_command_init(&slave->mbox_command);
+
INIT_LIST_HEAD(&slave->eeprom_strings);
INIT_LIST_HEAD(&slave->eeprom_syncs);
INIT_LIST_HEAD(&slave->eeprom_pdos);
INIT_LIST_HEAD(&slave->sdo_dictionary);
+
+ for (i = 0; i < 2; i++) {
+ slave->dl_status_link[i] = 0;
+ slave->dl_status_loop[i] = 0;
+ slave->dl_status_comm[i] = 0;
+ }
}
/*****************************************************************************/
@@ -129,6 +133,8 @@
}
kfree(sdo);
}
+
+ ec_command_clear(&slave->mbox_command);
}
/*****************************************************************************/
@@ -149,7 +155,7 @@
// Read base data
if (ec_command_nprd(command, slave->station_address, 0x0000, 6)) return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Reading base data from slave %i failed!\n",
slave->ring_position);
return -1;
@@ -166,7 +172,7 @@
// Read DL status
if (ec_command_nprd(command, slave->station_address, 0x0110, 2)) return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Reading DL status from slave %i failed!\n",
slave->ring_position);
return -1;
@@ -236,7 +242,7 @@
EC_WRITE_U8 (command->data, 0x00); // read-only access
EC_WRITE_U8 (command->data + 1, 0x01); // request read operation
EC_WRITE_U32(command->data + 2, offset);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("SII-read failed on slave %i!\n", slave->ring_position);
return -1;
}
@@ -254,7 +260,7 @@
if (ec_command_nprd(command, slave->station_address, 0x502, 10))
return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Getting SII-read status failed on slave %i!\n",
slave->ring_position);
return -1;
@@ -301,7 +307,7 @@
EC_WRITE_U8 (command->data, 0x00); // read-only access
EC_WRITE_U8 (command->data + 1, 0x01); // request read operation
EC_WRITE_U32(command->data + 2, offset);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("SII-read failed on slave %i!\n", slave->ring_position);
return -1;
}
@@ -319,7 +325,7 @@
if (ec_command_nprd(command, slave->station_address, 0x502, 10))
return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Getting SII-read status failed on slave %i!\n",
slave->ring_position);
return -1;
@@ -370,7 +376,7 @@
EC_WRITE_U8 (command->data + 1, 0x02); // request write operation
EC_WRITE_U32(command->data + 2, offset);
EC_WRITE_U16(command->data + 6, value);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("SII-write failed on slave %i!\n", slave->ring_position);
return -1;
}
@@ -388,7 +394,7 @@
if (ec_command_nprd(command, slave->station_address, 0x502, 2))
return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Getting SII-write status failed on slave %i!\n",
slave->ring_position);
return -1;
@@ -726,7 +732,7 @@
if (ec_command_npwr(command, slave->station_address, 0x0120, 2)) return;
EC_WRITE_U16(command->data, state | EC_ACK);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_WARN("State %02X acknowledge failed on slave %i!\n",
state, slave->ring_position);
return;
@@ -741,7 +747,7 @@
if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
return;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_WARN("State %02X acknowledge checking failed on slave %i!\n",
state, slave->ring_position);
return;
@@ -791,7 +797,7 @@
if (ec_command_npwr(command, slave->station_address, 0x0120, 2)) return -1;
EC_WRITE_U16(command->data, state);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Failed to set state %02X on slave %i!\n",
state, slave->ring_position);
return -1;
@@ -806,7 +812,7 @@
if (ec_command_nprd(command, slave->station_address, 0x0130, 2))
return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_ERR("Failed to check state %02X on slave %i!\n",
state, slave->ring_position);
return -1;
@@ -1049,7 +1055,7 @@
command = &slave->master->simple_command;
if (ec_command_nprd(command, slave->station_address, 0x0300, 4)) return -1;
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_WARN("Reading CRC fault counters failed on slave %i!\n",
slave->ring_position);
return -1;
@@ -1082,7 +1088,7 @@
// Reset CRC counters
if (ec_command_npwr(command, slave->station_address, 0x0300, 4)) return -1;
EC_WRITE_U32(command->data, 0x00000000);
- if (unlikely(ec_master_simple_io(slave->master))) {
+ if (unlikely(ec_master_simple_io(slave->master, command))) {
EC_WARN("Resetting CRC fault counters failed on slave %i!\n",
slave->ring_position);
return -1;
@@ -1094,122 +1100,6 @@
/*****************************************************************************/
/**
- Bereitet ein Mailbox-Send-Kommando vor.
- */
-
-uint8_t *ec_slave_prepare_mailbox_send(ec_slave_t *slave, /**< Slave */
- uint8_t type, /**< Mailbox-Protokoll */
- size_t size /**< Datengröße */
- )
-{
- size_t total_size;
- ec_command_t *command;
-
- if (unlikely(!slave->sii_mailbox_protocols)) {
- EC_ERR("Slave %i does not support mailbox communication!\n",
- slave->ring_position);
- return NULL;
- }
-
- total_size = size + 6;
- if (unlikely(total_size > slave->sii_rx_mailbox_size)) {
- EC_ERR("Data size does not fit in mailbox!\n");
- return NULL;
- }
-
- command = &slave->master->simple_command;
-
- if (ec_command_npwr(command, slave->station_address,
- slave->sii_rx_mailbox_offset,
- slave->sii_rx_mailbox_size)) return NULL;
- EC_WRITE_U16(command->data, size); // Mailbox service data length
- EC_WRITE_U16(command->data + 2, slave->station_address); // Station address
- EC_WRITE_U8 (command->data + 4, 0x00); // Channel & priority
- EC_WRITE_U8 (command->data + 5, type); // Underlying protocol type
-
- return command->data + 6;
-}
-
-/*****************************************************************************/
-
-/**
- Empfängt ein Mailbox-Kommando.
- */
-
-uint8_t *ec_slave_mailbox_receive(ec_slave_t *slave, /**< Slave */
- uint8_t type, /**< Protokoll */
- size_t *size /**< Größe der gelesenen
- Daten */
- )
-{
- ec_command_t *command;
- size_t data_size;
- cycles_t start, end, timeout;
-
- command = &slave->master->simple_command;
-
- // Read "written bit" of Sync-Manager
- start = get_cycles();
- timeout = (cycles_t) 100 * cpu_khz; // 100ms
-
- while (1)
- {
- // FIXME: Zweiter Sync-Manager nicht immer TX-Mailbox?
- if (ec_command_nprd(command, slave->station_address, 0x808, 8))
- return NULL;
- if (unlikely(ec_master_simple_io(slave->master))) {
- EC_ERR("Mailbox checking failed on slave %i!\n",
- slave->ring_position);
- return NULL;
- }
-
- end = get_cycles();
-
- if (EC_READ_U8(command->data + 5) & 8)
- break; // Proceed with received data
-
- if ((end - start) >= timeout) {
- EC_ERR("Mailbox check - Slave %i timed out.\n",
- slave->ring_position);
- return NULL;
- }
-
- udelay(100);
- }
-
- if (ec_command_nprd(command, slave->station_address,
- slave->sii_tx_mailbox_offset,
- slave->sii_tx_mailbox_size)) return NULL;
- if (unlikely(ec_master_simple_io(slave->master))) {
- EC_ERR("Mailbox receiving failed on slave %i!\n",
- slave->ring_position);
- return NULL;
- }
-
- if ((EC_READ_U8(command->data + 5) & 0x0F) != type) {
- EC_ERR("Unexpected mailbox protocol 0x%02X (exp.: 0x%02X) at"
- " slave %i!\n", EC_READ_U8(command->data + 5), type,
- slave->ring_position);
- return NULL;
- }
-
- if (unlikely(slave->master->debug_level) > 1)
- EC_DBG("Mailbox receive took %ius.\n", ((u32) (end - start) * 1000
- / cpu_khz));
-
- if ((data_size = EC_READ_U16(command->data)) >
- slave->sii_tx_mailbox_size - 6) {
- EC_ERR("Currupt mailbox response detected!\n");
- return NULL;
- }
-
- *size = data_size;
- return 0;
-}
-
-/*****************************************************************************/
-
-/**
Schreibt den "Configured station alias".
\return 0, wenn alles ok, sonst < 0
*/